Inicio > Ingeniería Informática > dfmarin > Numeros aleatorios en C de linux

Numeros aleatorios en C de linux

Experto:
Usuario:
Fecha: 06/09/2008
Valoración: (5,00 sobre 5) Categoría: Ingeniería Informática
06/09/2008
ferchik, usuario preguntando en Ingeniería Informática
Usuario
Cómo genero numeros aleatorios en C de linux?. Utilizo la funcion random() y srandom y me arroja siempre el mismo valor!!.
Gracias.F/
06/09/2008
ferchik, experto respondiendo en Ingeniería Informática
Experto
Bueno, deberias leer el manual acerca de la funcion "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 funcion "drand48()",
con una semilla, eso se hace con la funcion "srand48()", si usas la
misma semilla siempre, vas a obtener la misma secuencia de numeros
aleatorios, por lo que es mejor usar la hora actual (hora/min/seg),
como semilla, asi siempre seran secuencias diferentes de numeros
aleatorios (o pseudo-aleatorios para ser mas 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ñia son consideradas obsoletas, recomiendan
el uso de "rand", pero creo que deberias evaluar los resultados de
las distintas funciones y verificar cual se distribuye de acuerdo a
tus necesidades.

[linux] $ man 3 rand
_ _ _

Diego Fernando Marin
[] http://www.dfmarin.com

06/09/2008
ferchik, usuario preguntando en Ingeniería Informática
Usuario
Excelente. Una fantástica solución.
Enlaces patrocinados