2012-08-13 10 views
18

Estoy tratando de reproducir una secuencia aleatoria de random.random() de Python en un sistema diferente con una versión diferente de python3 instalada.¿Por qué sembrar el generador aleatorio no es estable entre las versiones de Python?

Esto debería ser fácil ya que el documentation says:

La mayoría de los algoritmos del módulo al azar y funciones de siembra son sujeto a cambios en las versiones de Python, pero dos aspectos están garantiza que no se cambie:

  • Si se agrega un nuevo método de siembra, se ofrecerá una sembradora compatible con versiones anteriores .
  • El método aleatorio() del generador continuará a producirá la misma secuencia cuando la sembradora compatible reciba la misma semilla .

así que espero que el siguiente código para imprimir siempre los mismos 10 números, no importa la versión python3 específica:

import sys 
print(sys.version) 

from random import seed, random 

seed(str(1)) 
for i in range(10): 
    print(random()) 

Sin embargo, para ello, en dos máquinas diferentes:

3.2.3 (default, May 3 2012, 15:51:42) 
[GCC 4.6.3] 
0.4782479962566343 
0.044242767098090496 
0.11703586901195051 
0.8566892547933538 
0.2926790185279551 
0.0067328440779825804 
0.0013279506360178717 
0.22167546902173108 
0.9864945747444945 
0.5157002525757287 

y

3.1.2 (release31-maint, Dec 9 2011, 20:59:40) 
[GCC 4.4.5] 
0.0698436845523 
0.27772471476 
0.833036057868 
0.35569897036 
0.36366158783 
0.722487971761 
0.963133581734 
0.263723867191 
0.451002768569 
0.0998765577881 

Dé diferentes resultados.

¿Por qué es esto? Y ¿hay alguna manera de hacer que esto funcione

+1

por lo que vale la pena, corriendo el fragmento de código en 2,7 produce un conjunto completamente diferente de los números que cualquiera de los dos informados. –

+3

Afirma que * se ofrecerá una sembradora compatible con versiones anteriores *, no que el método existente sea compatible con versiones anteriores. – borrible

Respuesta

15

que estaba buscando a través What's New in Python 3.2 (debido a esta pregunta), y me encontré con (es decir, conseguir la misma secuencia aleatoria dos veces?):

El random.seed() función y método ahora semillas de cadena de sal con una función hash sha512. Para acceder a la versión anterior de la semilla para reproducir las secuencias de Python 3.1, establezca el argumento de la versión en 1, random.seed (s, version = 1).

Parece ser un cambio de rotura (de 3.1 a 3.2) con una opción de compatibilidad con versiones anteriores.

(Como borrible señaló, debido a una sembradora compatibles es ofrecieron no se ha violado el contrato de documentación.)

+0

Gracias, este debe ser el problema. Debo decir que no es muy conveniente que el argumento de la versión no estuviera presente aún en 3.1 :( –

+1

Esto se aplica cuando usas cadenas de caracteres. A diferencia del OP, estoy sembrando mi generador de números aleatorios con ints, y viendo diferentes resultados. Por cierto, el método getstate() devuelve el mismo estado interno, por lo que no es el bit de siembra el que cambió, es la generación de números aleatorios reales. –

+3

Oh, de hecho veo random.random() produce la misma secuencia - es random.shuffle () y random.randrange() que producen resultados diferentes en Python 3.1 y 3.2, incluso cuando se les da la misma semilla. :-( –

4

la documentación para seed dicen que utilizan la función hash para convertir cadenas a las semillas de entrada válidos. Cuando probé varias versiones de Python2.X (no tengo 3 instaladas en este momento), algunas versiones dieron valores diferentes para hash(str(1)) Tenga en cuenta que los documentos para semilla dicen que, independientemente de la versión, usan el valor hash para la cadena. Es posible que desee pasar un int en su lugar (además del punto de @pst sobre el uso de la versión de semilla compatible con versiones anteriores).

Fragmento del random module docs por 3.2:

Si x es un int, se usa directamente.

Con la versión 2 (por defecto), un objeto str, bytes o bytearray obtiene convertido a un int y se utilizan todos sus bits. Con la versión 1, se usa el hash () de x en su lugar.

(x aquí es el inicializador para semilla)

Cuestiones relacionadas