¿Por qué la siembra del generador aleatorio no es estable entre las versiones de Python?

Estoy tratando de reproducir una secuencia aleatoria de random.random() de python en un sistema diferente con una versión diferente de python3 instalada.

Esto debería ser fácil ya que la documentación dice :

La mayoría de los algoritmos de los módulos aleatorios y las funciones de inicialización están sujetas a cambios en todas las versiones de Python, pero se garantiza que dos aspectos no cambian:

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

Así que espero que el siguiente código imprima siempre los mismos 10 números, sin importar la versión específica de python3:

 import sys print(sys.version) from random import seed, random seed(str(1)) for i in range(10): print(random()) 

Sin embargo, probándolo 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 

    Dar diferentes resultados.

    ¿Por qué es esto? ¿Y hay alguna manera de hacer que esto funcione (es decir, obtener la misma secuencia aleatoria dos veces?)

    Estaba buscando Lo nuevo en Python 3.2 (debido a esta pregunta), y encontré:

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

    Parece ser un cambio importante (de 3.1 a 3.2) con una opción de compatibilidad hacia atrás.

    (Como señaló el prestatario, porque a una sembradora compatible se le ofrece el contrato de documentación no se ha violado).

    Los documentos para seed dicen que usan la función hash para convertir cadenas en semillas de entrada válidas. 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 compatible con versiones anteriores).

    Fragmento de la documentación del módulo random para 3.2:

    Si x es un int, se usa directamente.

    Con la versión 2 (el valor predeterminado), un objeto str, bytes u bytearray se convierte en un int y se utilizan todos sus bits. Con la versión 1, el hash () de x se usa en su lugar.

    (x aqui esta el inicializador para semilla)