2012-09-16 7 views
7

Czy istnieje gwarancja, że ​​skrypt pyhon2/python3 z losowym generatorem zainicjowanym za pomocą random.setstate() lub random.seed() będzie generował tę samą sekwencję pseudolosowości w różnych wersjach i platformach? (na przykład: python 3.1 on Mac , the same as python 3.2 on Linux 64-bit)python random.setstate(), seed() - czy istnieje gwarancja takich samych wyników we wszystkich implementacjach?

Pytanie dotyczy zarówno python2, jak i python3, przy założeniu, że skrypty python3 będą działać na interpreterach python3 i na odwrót.

+0

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

+0

nie mówi, czy python3.x i python3.y gdzie x! = y będzie dawać takie same wyniki –

+1

Jeśli dokumentacja nie stwierdza, że ​​wyniki są gwarantowane są takie same w różnych wersjach pythona , to nie jest częścią API i nie jest zależne od tego. A przynajmniej tak myślę. Mimo że fakt, że algorytm jest wymieniony, może prowadzić do zadawania pytania. – Bakuriu

Odpowiedz

6

Python 2.3 i nowsze używają generatora Mersenne Twister, który jest niezależny od systemowej funkcji losowej (zaimplementowanej jako moduł rozszerzający C dla Pythona). W przypadku każdej wersji przy użyciu narzędzia Mersenne Twister wyniki powinny być takie same dla różnych wersji i platform.

Wcześniej można było zagwarantować kompatybilność wsteczną za pomocą generatora WichmannHill, ale niestety wydaje się, że została usunięta w języku Python 3.x.

Jeśli koniecznie trzeba zagwarantować kompatybilność, wyraź swoją Random podklasę (lub użyć stabilną realizację zewnętrznego, np simplerandom), zgodnie z zaleceniami dokumentacji random:

klasa losowe mogą być również podklasy jeśli chcesz aby użyć innego podstawowego generatora własnych rozwiązań: w takim przypadku zastąp metody losowe(), seed(), getstate(), setstate() i jumpahead(). Opcjonalnie nowy generator może dostarczyć metodę getrandbits() - dzięki temu funkcja randrange() może generować selekcje w dowolnie dużym zakresie.

4

Można użyć modułu simplerandom, który ma spójną implementację niezależną od platformy Python. Obsługuje Python 2.4, 2.5, 2.6, 2.7, 3.1 i 3.2. Ma 9 różnych algorytmów.

Oto przykład:

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

I tak długo, jak materiał siewny o tej samej wartości, można uzyskać takie same wyniki:

>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> rng = sri.MWC1(98765) 
>>> next(rng) 
3546724783L 
Powiązane problemy