srand() + time() en Linux
Pablo Cruz Navea
pablo.cruz en gmail.com
Mar Oct 10 23:04:08 CLT 2006
On 10/8/06, Horst H. von Brand <vonbrand en inf.utfsm.cl> wrote:
> Pablo Cruz Navea <pablo.cruz en gmail.com> wrote:
> > estoy trabajando con un programa en C que depende de la generación de
> > números aleatorios. Lo que hago es lo siguiente:
> >
> > ....
> > srand (time (NULL));
> > i = rand () % 2;
> > ....
>
> > Lo de %2 es para generar sólo números binarios. El problema que tengo
> > es que time (NULL) varía muy lentamente, y el programa se "pega" mucho
> > tiempo con los mismos números.
>
> - Se llama srand(3) /una/ vez al comienzo del programa, no cada vez!
> - Usa gettimeofday(2) como fuente de la semilla inicial si segundos no te
> basta, combina con getpid(2), ...
> - /Lee/ el manual de srand(3), dice /explicitamente/ que esa manera de
> obtener bits aleatorios no se recomienda (en las implementaciones tipicas
> de rand(3), simplemente obtienes una secuencia alternante 0101010...)
¿De qué otra forma se podría obtener aleatorios binarios? Para dejar
de usar el rand () % 2 hice algo como esto:
....
srand (....);
val = rand () % 2000;
if (val >= 1000)
num = 1;
else
num = 0;
....
Pero eso dependerá de la probabilidad con que los números de rand () %
2000 sean mayores o iguales a 1000 (o bien menores que 1000). ¿Es
buena idea esto?
Saludos.
Más información sobre la lista de distribución Linux