2012-09-16 21 views
7

¿Existe garantía de que el script pyhon2/python3 con generador aleatorio inicializado con random.setstate() o random.seed() producirá la misma secuencia de pseudoaleatoriedad en las diferentes versiones y plataformas? (por ejemplo python 3.1 on Mac , the same as python 3.2 on Linux 64-bit)python random.setstate(), seed() - ¿hay garantía de obtener los mismos resultados en todas las implementaciones?

La pregunta es sobre ambos: python2 y python3, con la suposición de que los scripts python3 se ejecutarán en los intérpretes de python3 y viceversa.

+0

http://docs.python.org/dev/ library/random.html # random.seed –

+0

no dice si python3.x y python3.y donde x! = y producirán los mismos resultados –

+1

Si la documentación no indica que se garantiza que los resultados serán los mismos en todas las versiones de python , entonces eso no es parte de la API y no es correcto depender de ella. O, al menos, esto es lo que creo. Aunque, el hecho de que el algoritmo se menciona puede llevar a hacer su pregunta. – Bakuriu

Respuesta

6

Python 2.3 y superior utilizan el generador Mersenne Twister, que es independiente de la función aleatoria del sistema (implementado como un módulo de extensión C para Python). Para cualquier versión que use Mersenne Twister, los resultados deberían ser los mismos en todas las versiones y plataformas.

Anteriormente, se podía garantizar la compatibilidad con versiones anteriores utilizando el generador WichmannHill, pero desafortunadamente parece que se ha eliminado en Python 3.x.

Si es absolutamente necesario para garantizar la compatibilidad, escriba su propia Random subclase (o utilizar una aplicación externa estable, por ejemplo simplerandom) según lo recomendado por el random documentación:

Clase aleatoria también puede tener subclases si quieren para usar un generador básico diferente de su propio diseño: en ese caso, anule los métodos random(), seed(), getstate(), setstate() y jumpahead(). Opcionalmente, un nuevo generador puede suministrar un método getrandbits(); esto permite que randrange() produzca selecciones en un rango arbitrariamente grande.

4

Puede usar el módulo simplerandom, que tiene una implementación consistente independiente de la plataforma Python. Tiene soporte para Python 2.4, 2.5, 2.6, 2.7, 3.1 y 3.2. Tiene 9 algoritmos diferentes.

He aquí un ejemplo:

>>> import simplerandom.iterators as sri 
>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> next(rng) 
888940288L 
>>> next(rng) 
345072384L 

Y todo el tiempo que la semilla con el mismo valor, se obtiene el mismo resultado:

>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> rng = sri.MWC1(98765) 
>>> next(rng) 
3546724783L 
Cuestiones relacionadas