usando rand para generar un número aleatorio

gcc 4.4.4 c89

Estoy usando el código a continuación. Sin embargo, sigo obteniendo el mismo número:

size_t i = 0; for(i = 0; i < 3; i++) { /* Initialize random number */ srand((unsigned int)time(NULL)); /* Added random number (simulate seconds) */ add((rand() % 30) + 1); } 

Me gustaría obtener de 0 a 30 devueltos. Sin embargo, la última vez que ejecuté esto obtuve 17 tres veces.

Muchas gracias,

Está siembrando dentro del bucle (con el mismo valor debido a la rapidez con que se ejecutará el bucle), lo que hace que el número aleatorio generado sea el mismo cada vez.

Necesita mover su función semilla fuera del ciclo:

 /* Initialize random number */ srand((unsigned int)time(NULL)); for(i = 0; i < 3; i++) { /* Added random number (simulate seconds) */ add((rand() % 30) + 1); } 

Debe llamar a Srand una sola vez, al comienzo de su progtwig.

srand inicializa el generador de números pseudoaleatorios usando el tiempo en segundos. Si lo inicializa con un número particular, siempre obtendrá la misma secuencia de números. Es por eso que generalmente quieres inicializarlo al principio usando el tiempo (para que la semilla sea diferente cada vez que ejecutas el progtwig) y luego usar solo rand para generar números que parecen aleatorios.

En su caso, el tiempo no cambia de iteración a iteración, ya que su resolución es de solo 1 segundo, por lo que siempre obtendrá el primer número de la secuencia pseudoaleatoria, que siempre es la misma.

Necesita hacer srand((unsigned int)time(NULL)) solo una vez antes del ciclo.

Es completamente posible que las 3 veces 17 sigan siendo completamente aleatorias.

Hay aproximadamente 1 en 10 posibilidades de obtener dos números iguales cuando se usa un rango de 1-30 y tres selecciones. (Esto se debe al problema del cumpleaños )

Ahora, obtener tres los mismos resultados todavía tiene una capacidad de propagación de 1 en 900 usando el mismo rango.

es posible que desee leer más antecedentes en la página de análisis de random.org

La semilla en el pseudo generador de números aleatorios se debe invocar solo una vez fuera del ciclo. Usar el tiempo como semilla es algo bueno. Sin embargo, todavía hay una posibilidad de obtener el mismo número aleatorio.

También sugiero usar la llamada al sistema gettimeofday () para recuperar la semilla que se utilizará para alimentar a srand ().

Algo como

struct timeval tv; ... gettimeofday(&tv, NULL); srand(tv.tv_usec); ...
struct timeval tv; ... gettimeofday(&tv, NULL); srand(tv.tv_usec); ... 

Este enfoque puede agregar más entropía en su código de generación de pseudo números. En mi humilde opinión, por supuesto

Ciao ciao