2009-10-12 22 views
10

Considere código como este (Python):¿Cuán diferentes deben ser las semillas al azar?

import random 

for i in [1, 2, 3, 4]: 
    random.seed(i) 
    randNumbers = [random.rand() for i in range(100)] # initialize a list with 100 random numbers 
    doStuff(randNumbers) 

quiero para asegurarse de que randNumbers difieren significativamente de una llamada a otra. ¿Debo asegurarme de que los números de las semillas difieren significativamente entre las siguientes llamadas, o es suficiente que las semillas sean diferentes (no importa cómo)?

Para los pedantes: Por favor, entiendan el código anterior es super-sobre-simplifica

+0

"difieren significativamente", en el contexto de generadores de números aleatorios, podría significar muchas cosas diferentes. ¿Hay pruebas específicas de aleatoriedad que está buscando pasar y no están actualmente? Los PRNG típicos tienen períodos mucho, mucho más largos que 100 números. Por lo general, uno ve un solo evento de siembra desde un reloj del sistema. Usando el mismo valor de inicialización que usted generará la misma secuencia pseudoaleatoria cada vez. – Mikeb

+0

¿Podría explicar por qué quiere que sus números pseudoaleatorios sean significativamente diferentes? ¿No es eso derrotar el propósito de los números aleatorios si necesita una desviación? Desde el punto de vista estadístico, es probable que obtenga dos números juntos en secuencia, ya que están muy separados (si son realmente aleatorios) –

Respuesta

8

Respuesta corta: Evite volver a sembrar, ya que no le compra nada aquí. Respuesta larga a continuación.


Todo depende de lo que necesite exactamente. En Common defects in initialization of pseudorandom number generators se describe que las semillas lineales dependientes (que 1, 2, 3, 4 definitivamente son) son una mala elección para inicializar múltiples PRNG, al menos cuando se usan para la simulación y desean resultados no correlacionados.

Si todo lo que hace es tirar unos dados, o generar alguna entrada pseudoaleatoria para algo no crítico, entonces es muy probable que no importe.

Tenga en cuenta también que el uso de algunas clases de un PRNG en sí mismo para generar semillas tiene el mismo problema en la generación de números lineales dependientes (los LCG vienen a la mente).

2

En términos generales, sólo las semillas de su generador de números aleatorios cuando necesidad los números aleatorios que se genere de forma idéntica cada vez a través . Esto es útil cuando tiene un componente aleatorio para su procesamiento, pero necesita probarlo y, por lo tanto, desea que sea consistente entre las pruebas. De lo contrario, dejas que el sistema sembremos el generador.

En otras palabras, al sembrar el generador de números aleatorios con semillas predefinidas específicas, en realidad está reduciendo la aleatoriedad del sistema como un todo. Los números aleatorios generados cuando se usa una semilla de 1 son de hecho psuedo-aleatoriamente diferentes de aquellos con una semilla de 2, pero una semilla codificada dará lugar a secuencias aleatorias repetidas en cada ejecución del programa.

0

Las semillas mismas deben ser aleatorias para que la salida sea impredecible. Puede haber problemas si las semillas difieren solo en uno o dos bits (como lo demuestra this question).

+1

Siembra manual generalmente implica que la salida no necesita ser impredecible. Y cuánto deben diferenciar las semillas depende en gran medida del algoritmo del PRNG. – Joey

+0

Implica que la salida no necesita ser impredecible, pero eso también supone que el que pregunta realmente se da cuenta de que los generadores sembrados producen la misma secuencia de números. – Matt

+0

@Johannes: Absolutamente, pero si realmente quieres un resultado impredecible, entonces no quieres que alguien adivine la semilla. Por esta razón, es mejor que la semilla en sí sea completamente impredecible (por ejemplo, desde/dev/random). –

0

Depende de la aplicación para la que está utilizando el PRNG. Si estás usando algo que necesita ser criptográficamente sonido, a continuación, las semillas generalmente tienen que ser extremadamente difícil deducir basándose en la salida, diferente cada vez que se ejecuta la aplicación, simplemente difícil de adivinar, y es imposible determinar mediante ingeniería inversa de la aplicación (es decir, no se pueden codificar de forma rígida).

Si su objetivo es un juego, sus requisitos pueden ser diferentes. Por ejemplo, si estás controlando la estrategia de la computadora, pero la estrategia de la computadora sigue siendo la misma para todas las carreras del juego, es posible que tengas un juego fácilmente derrotable. Por otra parte, es posible que desee para el modo "fácil".

+1

Si esto tiene algo que ver con crypto, entonces MT19937 es un generador muy equivocado para empezar. – Joey

1

parece que quieres números pseudo-aleatorios que no son pseudo-aleatorio, con una probabilidad más alta de números consecutivos siendo 'significativamente' diferente de pseudo-aleatoriedad requiere. Dudo que cualquier proceso común haga esto, cualquiera que sea su estrategia de siembra.

4

Si su generador de números aleatorios es de alta calidad, no debería importar cómo lo siembra. De hecho, la mejor práctica sería sembrarlo solo una vez.Los generadores de números aleatorios están diseñados para tener cierto comportamiento estadístico una vez que se hayan iniciado. La resiembra frecuente crea efectivamente un generador de números aleatorios diferente, uno que puede no ser tan bueno.

Selección aleatoria de semillas suena como una buena idea, pero no lo es. De hecho, debido a la "paradoja del cumpleaños", hay una probabilidad sorprendentemente alta de que elijas la misma semilla dos veces.

Cuestiones relacionadas