[C con Clase] rand () y srand () en c

Programante programante en gmail.com
Mar Mayo 26 23:46:06 CEST 2009


Jose Alvaro Dominguez escribió:
>> generación de números pseudo-aleatorios. Por lo tanto, sólo debes invocar
>> 'srand()' una sola vez en tu programa. Aconsejo hacer esto nada más entrar
>> en 'main()'. Para ofrecer algo más de aleatoriedad, sugiero tomar el valor
>> que representa la fecha y hora cada vez que ejecutes tu programa. Esto lo
>> puedes hacer invocando la función 'time()'. Por ejemplo,
>>     
>
> Con eso estarias eliminando la (poca) aleatoriedad de la secuencia,
> introduciendo un patron "predecible" basado en tiempo. Para un par de
> valores... y si la aplicacion no tiene mayor importancia...tiene pase,
> pero si es para algo especialmente critico...no creo que sea solucion.
>   
Al revés. No inicializarlo equivale a inicializarlo como srand(0), y
*siempre* dará la misma
secuencia. Resulta útil si se quiere depurar. Para nada más.
Los sistemas operativos actuales disponen de métodos para generar
números muy aleatorios, pero
desgraciadamente el estándar ANSI C exige que la secuencia sea siempre
la misma para una
semilla fija, lo que impide que las librerías del sistema usen mejores
números aleatorios :(

Usar el tiempo actual es una de las opciones más comunes y de hecho es
lo único que está
introduciendo aleatoriedad (entropía) a la secuencia. Su mayor ventaja
es que será cada vez diferente
y que al ser ANSI es 100% portable.

> Yo le echaria un ojo al Mersenne twister [1]. Es bastante rapido y
> genera secuencias bastante poco predecibles, ademas de contar con un
> bombazo de implementaciones. La pega? que no esta contemplado en el
> ansi.. pero como suelo leer a mucha gente usando cosas raras en plan
> "conio" ... tampoco creo que sea un impedimento.
>
> [1] http://en.wikipedia.org/wiki/Mersenne_twister
>
>
> Un saludo.
>   
El mersenne twister es una buena opción. Creo que está incorporado en
las opciones de números aleatorios
de boost para el próximo estándar de C++.
Aunque si es un sistema Linux, resulta más sencillo leer de /dev/urandom.








Más información sobre la lista de distribución Cconclase