[C con Clase] Limitar el rango de un numero aleatorio
Programante
programante en gmail.com
Vie Jun 19 22:56:50 CEST 2009
Mariano Demarchi escribió:
> Hola a todos, estaba viendo un mail que enviaron a la lista en donde
> decian que cuando se quiere limitar el rango en el que se obtienen
> valores aleatorios, por ejemplo usando rand(), la expresion:
> valor_generado = valor_inicial + (int)(
> rand()*(intervalo/(RAND_MAX+1.0)) + 0.5 );
> genera valores mas aleatorios que:
> valor_generado = valor_inicial + rand() % intervalo;
> Para mi no es asi, pero me gustaria saber su opinion y la razon de ésta.
> Saludos
Porque puede no haber el mismo número de elementos en cada clase.
Supongamos que RAND_MAX sea 9, es decir, que tienes una función que te
produce un
número perfectamente aleatorio de 0 a 9.
Si lo que quieres es obtener un número de 0 a 4, el módulo te sirve
perfectamente, porque
todas las clases tienen los mismos elementos.
En cambio si lo que quieres es un número de 0 a 5 (por ejemplo para
simular un dado)
usar el módulo te dará un resultado sesgado:
Tu valor | Valores de la función aleatoria | Frecuencia
0 -> 0, 6 20%
1-> 1, 7 20%
2 -> 2, 8 20%
3 -> 3, 9 20%
4 -> 4 10%
5 -> 5 10%
¡Cuesta el doble sacar los números altos! (aunque dependiendo del juego,
igual te interesa, jeje).
Más información sobre la lista de distribución Cconclase