Ejecute rand () en lenguaje C y realice un bucle con los scripts de shell

Tengo un archivo de código C (llamado ” test.c ” y la salida es ” test.out “) como a continuación y solo una salida simple de un número aleatorio:

int main() { srand(time(NULL)); double r = (double)rand() / (double)RAND_MAX; printf("%f\n", r); return 0; } 

y ahora uso scripts de shell para ejecutar ” test.out ” 5 veces en Linux, el siguiente código:

 for i in 1 2 3 4 5 do test.out done 

pero el resultado se muestra como abajo

 0.840188 0.840188 0.840188 0.840188 0.840188 

Muestra el mismo número aleatorio.

Inicializa el generador pseudoaleatorio utilizando la hora actual. En la mayoría de las plataformas, la función de time devuelve la hora actual en segundos . Si ejecuta este progtwig varias veces en un solo segundo, establecerá la misma semilla en todas las ejecuciones y obtendrá el mismo número “aleatorio”.

Agregue, por ejemplo, un sleep 1 en el bucle en el script y verá un resultado diferente.

rand() producirá la misma secuencia de números para la misma semilla (la que estableció con srand() ).

Es muy probable que su bucle se ejecute demasiado rápido y que todas sus ejecuciones terminen utilizando la misma semilla (es decir, el time(NULL) devuelve el mismo valor). Por lo tanto, se ve la misma salida.

Puede drand48() lugar de producir números distribuidos uniformemente. O si simplemente quiere probar rand() , puede agregar un retraso entre sus iteraciones.

 for i in 1 2 3 4 5 do test.out done 

Ejecuta el progtwig 5 veces en el mismo segundo, y como está usando el tiempo del sistema en segundos como semilla para su función rand() , naturalmente obtendrá los mismos resultados. Si esperas un segundo (o más de un segundo) entre las ejecuciones, obtendrás diferentes valores.