2011-11-04 78 views
3

我使用公知的隨機種子產生一些測試數據。我想從cpython和jython中使用這些數據。我發現如果我使用jython(2.5.2)和cpython,數據是不同的。Jython的隨機模塊產生不同的結果CPython的

沸騰它歸結爲一個簡單的測試,我可以看到,PRNG在兩種實現方式給予不同的結果:

在Jython中:

Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06) 
[Java HotSpot(TM) Server VM (Sun Microsystems Inc.)] on java1.6.0_26 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import random 
>>> random.seed(1) 
>>> random.random() 
0.7308781974052877 

在CPython中:

Python 2.7.2+ (default, Oct 4 2011, 20:03:08) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import random 
>>> random.seed(1) 
>>> random.random() 
0.13436424411240122 

我生成的測試數據在每個python實現中都是可重現的。有沒有解決的辦法?也許我需要編寫自己的PRNG?

+1

這是可以預期的。這些東西幾乎總是實現細節。 – delnan

+1

也許這是您正在尋找的隨機數生成器:http://dilbert.com/strips/comic/2001-10-25/ –

回答

6

有解決的辦法。兩種實現都包含純python「WichmannHill」PRNG。 速度較慢,但​​它在Jython和CPython中都有相同的結果。

在我的代碼替換

random.seed(1) 
uuid += random.choice(hexdigits) 

rand = random.WichmannHill(1) 
uuid += rand.choice(hexdigits) 
3

正如說在評論delnan:這是不是一個驚喜,不同的Python解釋產生不同的隨機序列。 official documentation涉及算法的C實現。其他Python實現可能會選擇其他算法。事實上,最低的共同點可能是產生的隨機序列的分佈。

如果你依賴於它可以在你編寫自己的僞隨機數生成器所有的Python解釋器進行復制的僞隨機序列。 A linear feedback shift register可能是一個好的開始,並且相對容易理解。