Un generador de números aleatorios tiene un estado, eso es realmente una característica necesaria. El siguiente número "aleatorio" es una función del número anterior y la semilla/estado. Los puristas los llaman generadores de números pseudoaleatorios. Los números pasarán pruebas estadísticas de aleatoriedad, pero en realidad no son aleatorios.
La secuencia de valores aleatorios es finita y se repite.
Imagine que un generador de números aleatorios mezcla una colección de números y los distribuye en orden aleatorio. La semilla se usa para "mezclar" los números. Una vez que se establece la semilla, la secuencia de números es fija y muy difícil de predecir. Algunas semillas se repetirán antes que otras.
La mayoría de los generadores tienen un período que es suficientemente largo para que nadie lo note repitiendo. Un generador de números aleatorios de 48 bits producirá varios cientos de miles de millones de números aleatorios antes de que se repita, con (AFAIK) cualquier valor de inicialización de 32 bits.
Un generador dará solo generará valores aleatorios cuando le dé una sola semilla y permita que arroje valores. Si cambia las semillas, los números generados con el nuevo valor inicial pueden no parecer aleatorios en comparación con los valores generados por la semilla anterior: todas las apuestas se desactivan cuando se cambian las semillas. Entonces no.
Un enfoque sensato es tener un generador y "repartir" los números entre sus diferentes clientes. No te metas con crear y descartar generadores. No te metas con el cambio de semillas.
Sobre todo, nunca intente escribir su propio generador de números aleatorios. Los generadores incorporados en la mayoría de las bibliotecas de idiomas son realmente buenos. Especialmente los modernos que usan más de 32 bits.
Algunas distribuciones Linux tienen un dispositivo /dev/random
y /dev/urandom
. Puede leerlos una vez para sembrar el generador de números aleatorios de su aplicación. Estos tienen más o menos valores aleatorios, pero funcionan mediante la "acumulación de ruido" de eventos aleatorios del sistema. Úselos con moderación para que haya muchos eventos aleatorios entre los usos.
Cualquier distribución de Linux debería tenerlos, y si realmente no los pueden encontrar. Sería posible construir un kernel sin ellos, pero ¿por qué lo harías? –
No estoy de acuerdo con que la mayoría de las bibliotecas de idiomas tengan generadores realmente buenos. La mayoría de las implementaciones de C's rand() son simplemente generadores congruenciales lineales con solo un valor de estado de int. HAY buenas implementaciones de bibliotecas, pero no asumiría que la que viene con el compilador es de calidad. Aparte de eso, buena respuesta. –
@Adrian McCarthy: No estoy seguro de que diría que "la mayoría" son pobres. Casi todos los Linuxen tienen las funciones rand48 que son 48 bits. Verifique sus páginas man para confirmar que las tiene y las puede usar. Son bastante aleatorios y también parecen ser estándar. –