[C con Clase] implementar función dado casi solucionado

Davidson, Steven srd4121 en njit.edu
Sab Ene 19 18:21:11 CET 2013


Hola Francisco José,

2013/1/19 Francisco Jose Sanchez-Caro Abril <fjsanchezcaro en gmail.com>

>
> Gracias Steven!
>
> Me han sido de gran ayuda tus consejos. Ahora la función se comporta de
> una forma más "natural", aunque, el primer lanzamiento es siempre el 6. ¿Se
> podría, aún, mejorar este aspecto y hacer algo para que salga otro número
> la primera vez que se invoca a la función?
>
>
Hemos iniciado el generador basándonos en la hora (y fecha) cuando se
ejecute el programa. Es normal que se elija el mismo generador si ejecutas
el programa varias veces seguidas, ya que no da tiempo a elegir a otro
generador.

También ten presente que elegimos valores entre 0 y 'RAND_MAX', que suele
ser un entero bastante grande, que luego serán "convertidos" a enteros
entre 1 y 6. Por lo tanto, es muy probable que obtengas valores repetidos,
ya que el 6 es el resultado a partir de un entero de entre miles generados.
Por ejemplo, si 'RAND_MAX' es 2147483647, la función 'rand()' puede generar
valores entre 1789569707 y 2147483647 que resultarán en el valor de 6. Por
lo tanto, cualquier valor inicial generado pseudo-aleatoriamente que
comprenda en el intervalo anterior dará 6 como resultado al lanzamiento del
dado.

Otra solución puede ser usando el operador del módulo de una división, como
hiciste originalmente, pero habría que comprobar que todos los valores
generados por 'rand()' "quepan" en grupos de 6; es decir, 'RAND_MAX' + 1
debe ser divisible entre 6, para que el dado siga una distribución uniforme
de probabilidad. En el ejemplo anterior, podríamos hacer esto:

Para el intervalo: [0,2147483645]:
  dado = 1 + rand()%6;

Para el intervalo: [2147483646,2147483647]
  Los ignoramos y repetimos el proceso; no es la solución más idónea, pero
sí la más práctica

Podríamos, escribir esto:

int Dado()
{
  int n;

  do
    n = rand();
  while( n > 2147483645 );

  return 1 + n%6;
}


La otra solución es usar otro algoritmo para generar números
pseudo-aleatorios, pero no creo que necesites hacer esto.


Espero que todo esto te sirva.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130119/b0fd8ca5/attachment.html>


Más información sobre la lista de distribución Cconclase