2011-02-02 37 views
7

我需要確保我的程序中的所有隨機都是完全可複製的。我應該在哪裏打電話給random.seed()?python 3:random.seed():在哪裏調用它?

我認爲它應該在我的main.py模塊中,但它會導入碰巧使用隨機函數的其他模塊。

我可以仔細地瀏覽我的導入,看看哪一個是第一個執行的,但是當我改變我的代碼結構時,我將不得不記得再次重做這個分析。

有沒有簡單和安全的解決方案?

+0

你擔心使用隨機函數的模塊會干擾可複製性嗎?只要他們自己不使用random.seed(),它應該沒問題。如果這不是你的擔心,你爲什麼擔心你的模塊發生了什麼? – 2011-02-02 23:46:26

+0

你是說你沒有一個能夠完成應用程序真正工作的頂級`main()`函數?爲什麼不? – 2011-02-03 01:10:48

回答

7

在主模塊的「導入部分」執行代碼實際上是安全的,所以如果您不確定導入其他可能使用或不使用隨機模塊的模塊,也許繞過您的種子,您當然可以如果你想隨意可複製使用類似

import random 
random.seed(seed_value) 

import something 
import else 

if __name__ == "__main__": 
    main() 
1

你可以推出自己的單例封裝隨機。然後,您可以使用Python documentation on random getstate和setstate來更改隨機數生成器的狀態。這會給你的程序帶來兩個隨機數生成器。

4

,它可能是最好做的random.Random一個實例在您的應用程序,在該實例調用seed(),並使用該實例的隨機數。

random.random()實際上使用random.Random類的單例,以方便不關心自己的類實例的人。但是這個單例可能與其他可能想要調用random.random()以產生隨機數的模塊共享。這就是爲什麼在你的情況下,你最好實例化你自己的random.Random實例。

the docs引用:

由該模塊提供的功能實際上是結合的random.Random類的隱藏的實例的方法。您可以實例化您自己的Random實例以獲取不共享狀態的生成器。