Tengo un programa bastante grande, donde uso funciones del random
módulo en diferentes archivos. Me gustaría poder establecer la semilla aleatoria una vez, en un lugar, para que el programa siempre devuelva los mismos resultados. ¿Se puede lograr eso en python
?
82
random
código de nivel de módulo, que está importando en main, antes de llegar arandom.seed(n)
in main, entonces esas llamadas se realizarán antes de la semilla, por lo que serán sembradas en el tiempo y de manera efectiva no reproducible. aleatorio.random.Random()
constructor y utilizarlos cuando la reproducibilidad estricta sea importante.El comentario de zss debe resaltarse como una respuesta real:
fuente
random module
, digamos, funciónrandom.choices()
y luego más abajo en algún otro punto elnumpy
generador de números aleatorios, digamosnp.random.normal()
que tiene que establecer la semilla para ambos módulos. Lo que suelo hacer es tener un par de líneas en mi memain.py
gustarandom.seed(my_seed)
ynp.random.seed(my_seed)
. Felicitaciones a zssset_random_seed()
para Sage.Al comienzo de su aplicación, llame
random.seed(x)
para asegurarse de que x sea siempre el mismo. Esto asegurará que la secuencia de números pseudoaleatorios sea la misma durante cada ejecución de la aplicación.fuente
Jon Clements prácticamente responde a mi pregunta. Sin embargo, no fue el problema real: resulta que la razón de la aleatoriedad de mi código fue el numpy.linalg SVD porque no siempre produce los mismos resultados para matrices mal acondicionadas.
¡Así que asegúrese de verificar eso en su código, si tiene los mismos problemas!
fuente
Basándose en respuestas anteriores: tenga en cuenta que muchas construcciones pueden divergir en las rutas de ejecución, incluso cuando todas las semillas están controladas.
Estaba pensando " bueno, puse mis semillas para que sean siempre las mismas, y no tengo dependencias externas / cambiantes, por lo tanto, la ruta de ejecución de mi código siempre debería ser la misma ", pero eso está mal.
El ejemplo que me mordió fue
list(set(...))
, donde el orden resultante puede diferir.fuente
Puede garantizar esto con bastante facilidad utilizando su propio generador de números aleatorios.
Simplemente elija tres números primos grandes (asumiendo que esta no es una aplicación de criptografía) y conéctelos a a, byc: a = ((a * b)% c) Esto le da un sistema de retroalimentación que produce datos bastante aleatorios. Tenga en cuenta que no todos los números primos funcionan igual de bien, pero si solo está haciendo una simulación, no debería importar; todo lo que realmente necesita para la mayoría de las simulaciones es una mezcla de números con un patrón (pseudoaleatorio, recuerde) lo suficientemente complejo como para no coincide de alguna manera con su aplicación.
Knuth habla de esto.
fuente