srand (time (NULL)) no cambia el valor de inicialización lo suficientemente rápido

He escrito un generador de números aleatorios simple en C. int l es el límite inferior e int u es el límite superior.

Funciona bien, sin embargo tengo una pregunta con respecto a sembrarlo. Si tuviera que ejecutar esto en un bucle, el time(NULL) no cambia el valor inicial lo suficientemente rápido para poder evitar obtener una serie consecutiva de números aleatorios que sean exactamente iguales.

Me pregunto cómo alguien más podría haber abordado este problema. Todos los ejemplos que he encontrado en línea usan time(NULL) como el generador de valores iniciales.

 int generateRandom(int l, int u) { srand(time(NULL)); int r = rand() % ((u - l) + 1); r = l + r; return r; } 

Si Rand2 que ejecutar estas líneas de código una al lado de la otra, tanto Rand1 como Rand2 serían exactamente iguales.

 printf("Rand1 = %d\n", generateRandom(10, 46)); printf("Rand2 = %d\n", generateRandom(10, 46)); 

srand(time(NULL)) debe ejecutarse exactamente una vez para iniciar el PRNG. Haz esto en Main cuando comience la aplicación.

Explicación:

Un PRNG (Generador de números pseudoaleatorios) genera una secuencia determinística de números que depende del algoritmo utilizado. Un algoritmo dado siempre producirá la misma secuencia desde un punto de partida dado (semilla). Si no se siembra explícitamente el PRNG, generalmente comenzará desde la misma semilla predeterminada cada vez que se ejecute una aplicación, lo que resulta en la misma secuencia de números que se utiliza.

Para arreglar esto, necesita sembrar el PRNG usted mismo con un simiente diferente (para dar una secuencia diferente) cada vez que se ejecuta la aplicación. El enfoque habitual es utilizar el time(NULL) que establece la semilla en función de la hora actual. Siempre que no inicie dos instancias de la aplicación en un segundo el uno del otro, se le garantizará una secuencia aleatoria diferente.

No es necesario sembrar la secuencia cada vez que desee un nuevo número aleatorio. Y no estoy seguro de esto, pero tengo la sensación de que, dependiendo del algoritmo PRNG que se use, la nueva siembra para cada nuevo número puede dar como resultado una aleatoriedad menor en la secuencia resultante.

Semilla una vez al comienzo de la principal. Si resembras demasiado rápido durante el mismo segundo, terminarás obteniendo los mismos números.

No lo siembre cada vez, solo al comienzo de su progtwig.

Además, muchos libros aconsejan no usar las funciones aleatorias estándar de C-lib. Si necesita buenos números pseudoaleatorios, hay un buen algoritmo en Press et al., Numerical Recipes, 3rd. Edición.

srand( (unsigned) time(NULL) * getpid());

produce un conjunto aleatorio más diverso (en OSX 10.8), incluso en pruebas de ciclo corto.

Supongo que llamas a la función generateRandom desde otra función, main o algo así.

Si declara la semilla dentro de la función, restablecerá la función. Al restablecer la función, aparecerán los mismos números varias veces, el mismo segundo.

Moving srand(time(NULL)); a la función principal resolverá el problema.

Si está utilizando procesos diferentes, use (rand()+getpid())%range; Lo uso para probar el mismo progtwig con valores aleatorios muchas veces por segundo (si haces números rand, sal del progtwig y corres de nuevo muy rápido, los números serán los mismos)