2012-09-16 32 views
7

是否可以保證在random.setstate()random.seed()上使用隨機生成器初始化的pyhon2/python3腳本會在不同版本和平臺間產生相同的僞隨機序列? (例如python 3.1 on Mac , the same as python 3.2 on Linux 64-bitpython random.setstate(),seed() - 跨實現保證有相同的結果嗎?

問題是關於兩者:python2和python3,假設python3腳本將在python3解釋器上運行,反之亦然。

+0

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

+0

它不會說如果python3.x和python3.y其中x!= y會產生相同的結果 –

+1

如果文檔沒有聲明結果保證在python版本中是相同的,那麼這不是API的一部分,依賴它是不正確的。或者至少,這是我的想法。儘管算法被提及的事實可能會導致問你的問題。 – Bakuriu

回答

6

Python 2.3及更高版本使用Mersenne Twister生成器,它獨立於系統隨機函數(作爲Python的C擴展模塊實現)。對於使用Mersenne Twister的任何版本,結果應該在版本和平臺上相同。

以前,您可以使用WichmannHill生成器保證向後兼容性,但不幸的是,它似乎已在Python 3.x中被刪除。

如果你絕對需要保證兼容性,寫自己的Random子類(或使用一個穩定的外部實現,例如simplerandom)所推薦的random文檔:

類隨機也被繼承,如果你想使用你自己設計的不同的基本生成器:在這種情況下,重寫random(),seed(),getstate(),setstate()和jumpahead()方法。可選地,新的生成器可以提供getrandbits()方法 - 這允許randrange()在任意大的範圍內生成選擇。

4

您可以使用simplerandom模塊,該模塊具有獨立於Python平臺的一致實現。它支持Python 2.4,2.5,2.6,2.7,3.1和3.2。它有9種不同的算法。

下面是一個例子:

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

而且只要你使用相同的種子值,你會得到相同的結果:

>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> rng = sri.MWC1(98765) 
>>> next(rng) 
3546724783L 
相關問題