¿Cómo genero números aleatorios en C de linux?. Utilizo la función random() y srandom y me arroja siempre el mismo valor!.
2 Respuestas
Respuesta de dfmarin
1
1
dfmarin, He usado Unix desde 1988, y comence con Linux en 1993, coordino...
Deberías leer el manual acerca de la función "random(3)": [linux] $ man random _ _ _ _ _ _ RANDOM(3) Manual del Programador de Linux RANDOM(3) NOMBRE random, srandom, initstate, setstate - generador de números aleatorios. SINOPSIS #include <stdlib.h> long int random(void); void srandom(unsigned int semilla); char *initstate(unsigned int semilla, char *estado, int n); char *setstate(char *estado); DESCRIPCIÓN La función random() emplea un generador no lineal aditivo con retroalimentación de números aleatorios utilizando una tabla predeterminada de 31 enteros largos para devolver números pseudo-aleatorios sucesivos en el rango de 0 a RAND_MAX. El periodo de este generador de números aleato rios es muy grande, aproximadamente 16*((2**31)-1). _ _ _ _ _ _ Te falta (por lo que sospecho) inicializar la función "drand48()", con una semilla, eso se hace con la función "srand48()", si usas la misma semilla siempre, vas a obtener la misma secuencia de números aleatorios, por lo que es mejor usar la hora actual (hora/min/seg), como semilla, así siempre serán secuencias diferentes de números aleatorios (o pseudo-aleatorios para ser más precisos!): [linux] $ man drand48 En ultimas, deberias hacer algo muy parecido a esto: _ _ _ _ _ _ #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { time_t tiempo; double aleatorio; /* defino la variable */ tiempo = time((time_t *)0); /* 0 = ahora */ srand48(tiempo); /* inicializacion */ aleatorio = drand48(); printf ("%12.6f\n", aleatorio); } _ _ _ _ _ _ Hoy, "drand48" y compañía son consideradas obsoletas, recomiendan el uso de "rand", pero creo que deberías evaluar los resultados de las distintas funciones y verificar cual se distribuye de acuerdo a tus necesidades. [linux] $ man 3 rand
Las funciones generen un numero aleatorio según la semilla el problema cuando utilizas ramdon y srandom es que debes inicializar la semilla para la función random la semilla se genera con la instrucción ramdonmize() y para srandom srand(struct time )