2012-06-05 13 views
5

Estoy usando semillas secuenciales (1,2,3,4, ...) para la generación de números aleatorios en una simulación. ¿El hecho de que las semillas estén cerca uno del otro hace que los números pseudoaleatorios generados sean similares también?¿Las semillas cercanas en la generación de números aleatorios pueden dar números aleatorios similares?

creo que no cambia nada, pero yo estoy usando Python

Edición: He hecho algunas pruebas y los números no ser similar. Pero me temo que la similitud no se puede notar solo mirando los números. ¿Hay alguna característica teórica de la generación de números aleatorios que garantice que las diferentes semillas den números pseudoaleatorios completamente independientes?

+2

Lo que puede hacer si usted no confía en el generador de números aleatorios (un poco de un truco, lo admito) es pasar a través de la semilla el algoritmo SHA1 de 'hashlib'; diseñado para mapear valores similares a otros completamente distintos. –

+0

He notado ese efecto, pero creo que fue en Microsoft C++, no en Python. Creo que el módulo 'random' usa mejores algoritmos. –

Respuesta

2

Definitivamente habrá una correlación entre la semilla y los números aleatorios generados, por definición. La pregunta es si el algoritmo de aleatorización es suficiente para producir resultados que parecen no correlacionados, y debe estudiar los métodos para evaluar la aleatoriedad para responder esa pregunta.

Sin embargo, tiene razón en estar preocupado. Éstos son los resultados de la función de Microsoft C++ rand con valores de semilla de 0 a 9:

38 7719 21238 2437 8855 11797 8365 32285 10450 30612 
    41 18467 6334 26500 19169 15724 11478 29358 26962 24464 
    45 29216 24198 17795 29484 19650 14590 26431 10705 18316 
    48 7196 9294 9091 7031 23577 17702 23503 27217 12168 
    51 17945 27159 386 17345 27504 20815 20576 10960 6020 
    54 28693 12255 24449 27660 31430 23927 17649 27472 32640 
    58 6673 30119 15745 5206 2589 27040 14722 11216 26492 
    61 17422 15215 7040 15521 6516 30152 11794 27727 20344 
    64 28170 311 31103 25835 10443 497 8867 11471 14195 
    68 6151 18175 22398 3382 14369 3609 5940 27982 8047 
+0

'rand' es notoriamente poco confiable en algunas plataformas. El módulo 'random' de Python usa un algoritmo Mersenne Twister, que no se considera lo suficientemente bueno para crypto, pero es mucho mejor que la mayoría de las implementaciones de' rand'. –

0

Primero: defina similitud. Siguiente: codifica una prueba de similitud. Entonces: verifique la similitud.

Con solo una descripción vaga de la similitud, es difícil comprobarlo.

0

¿Qué tipo de simulación estás haciendo?

Para fines de simulación, su argumento es válido (dependiendo del tipo de simulación) pero si lo implementa en un entorno que no sea simulación, podría ser pirateado fácilmente si requiere que existan problemas de seguridad del entorno basados ​​en los números aleatorios generados.

Si está simulando el resultado de una máquina, ya sea que sea perjudicial para la sociedad o no, el resultado de los resultados no será aceptable. Requiere una aleatoriedad máxima en todas las formas posibles y nunca confiaría en tu razonamiento.

0

Para citar la documentación del módulo de azar:

Notas generales sobre el núcleo generador de Mersenne Twister subyacente:

  • El período es 2 ** 19937-1.
  • Es uno de los generadores más probados que existen.

estaría más preocupado por mi código que es roto que mi RNG no ser lo suficientemente aleatoria. En general, tus sentimientos viscerales sobre la aleatoriedad van a estar equivocados: la mente humana es realmente buena para encontrar patrones, incluso si no existen.

Siempre que sepa que sus resultados no serán "seguros" debido a su falta de siembra aleatoria, debería estar bien.

+0

lo siento, ¿qué quiere decir con esto: "sus resultados no van a ser 'seguros' debido a su falta de siembra aleatoria"? ¿Qué quieres decir con "seguro"? ¿Y de hecho estás diciendo que no es seguro debido a mi siembra secuencial? Parece contradictorio con lo que dijiste antes sobre la confiabilidad del módulo aleatorio ... –

+0

@Homero: Quiero decir que, si usas esta aleatoriedad para cualquier tipo de seguridad, eres vulnerable a cualquiera que conozca tu método de siembra . Si, OTOH, estás ejecutando algún tipo de simulación y solo quieres resultados reproducibles, deberías obtener 'suficiente' aleatoriedad. –

+1

-1 porque la pregunta era sobre cómo una secuencia de semillas correlacionadas afecta la calidad de los números aleatorios producidos, no sobre la calidad de los números aleatorios cuando se basa en una sola semilla. Esta pregunta es relevante, por ejemplo, cuando se crean varios generadores diferentes (tal vez uno por hilo) al comienzo de un programa multiproceso. Desea evitar resultados correlacionados entre los generadores. Creo que la respuesta de @ rossum es una buena manera de hacer esto. –

2

Si le preocupan las semillas secuenciales, no use semillas secuenciales. Configure un RNG maestro, con una semilla conocida, y luego tome salidas sucesivas de ese RNG maestro para sembrar los diversos RNG secundarios según sea necesario.

Como conoce la semilla inicial para el maestro RNG, toda la simulación se puede ejecutar nuevamente, exactamente como antes, si es necesario.

masterSeed <- 42 
masterRNG <- new Random(masterSeed) 

childRNGs[] <- array of child RNGs 

foreach childRNG in childRNGs 
    childRNG.setSeed(masterRNG.next()) 
endforeach 
+1

No estoy seguro de que sea una buena idea, porque corres el riesgo de duplicar semillas. Por ejemplo, eso sería muy probable si estás generando números de 16 bits y ejecutando miles de procesos. – Will

+0

La pregunta se refiere a semillas secuenciales, no a semillas duplicadas. Si las semillas duplicadas son un problema, utilice un cifrado de bloque de 128 bits y cifre los números 0, 1, 2, 3, ... 2^128-1. Al ser un cifrado, se garantiza que los números no se duplicarán durante un tiempo muy largo, hasta que el contador se retire. Una tecla diferente dará una permutación diferente de los números. Para duplicar la permutación use la misma clave. – rossum

1

he encontrado medible, pero pequeña, las correlaciones en números aleatorios generados a partir de la Mersenne Twister utilizando las semillas secuenciales para múltiples simulaciones - los resultados de los cuales se promediaron para obtener los resultados finales. En Python en Linux, las correlaciones desaparecen si utilizo semillas generadas por la función aleatoria del sistema (números no pseudoaleatorios) a través de random.SystemRandom(). Guardo los números de SystemRandom en los archivos y los leo cuando se necesita una semilla en una simulación. Para generar semillas:

import random 
myrandom = random.SystemRandom 
x = myrandom.random  # yields a number in [0,1) 
dump x out to file... 

Luego, cuando se necesitan semillas

import random 
read x from file... 
newseed = int(x*(2**31)) # produce a 32 bit integer 
random.seed(newseed) 
nextran = random.random() 
nextran = random.random()... 
+0

¿Puede describir cómo midió la similitud? –

+0

No puedo acceder a mi aplicación en particular, pero el resultado fue casi el opuesto al similar: los números aleatorios cercanos (unas pocas llamadas aparte) se correlacionaron ligeramente negativamente porque si uno era menor que un número pequeño (~ 0.01), luego, los siguientes pocos tuvieron menos probabilidad de ser al azar que ese pequeño número. No hice pruebas exhaustivas y es posible que haya dado un salto aquí, pero hubo una tendencia consistente en múltiples casos de grandes cantidades de simulaciones con semillas secuenciales. – BugFinder