2011-01-22 111 views
0

我有一個包含不同模塊的項目。然後我有一個名爲Main.py的文件,它有一些在運行過程中調用這些模塊的代碼。在文件Main.py我設置使用隨機種子:具有相同隨機種子的不同實現

random.seed(2) 

的輸出,我從不同的運行得到的是不相同的,即使我用同樣的隨機種子。你能告訴我爲什麼會發生這種情況嗎?我班的各個模塊使用random.uniform, random.choice, random.sample函數。在一個地方,我也定義了rnduniform = random.uniform並使用它。

有關如何解決此問題的任何幫助(即能夠通過設置隨機種子來複制結果)並幫助我理解這一點,將不勝感激。

謝謝。

編輯:解決。我的錯誤。

對不起,浪費你的時間。我更仔細地查看了代碼,其中一個使用隨機數生成的函數在其中一個類的方法init中調用。在設置種子之前訪問方法init。我試圖刪除帖子,但我不能。因此,這個編輯。

+0

一些代碼會有所幫助。 – marcog 2011-01-22 13:04:06

回答

1

線程安全涉及併發編程 - 換句話說,當您通過線程同時執行兩個不同的代碼路徑時。由於可能作爲程序員給你的單行代碼通常是多個單獨的行爲,不同的線程可能會干擾你正在使用的任何變量,或者使用中間計算。這會導致很難理解錯誤,因爲通常你的代碼看起來完全沒問題。

在這種情況下,他說您的代碼使用random()和其他代碼在某種程度上使用隨機數生成器的線程可能會發生衝突並且行爲不如預期。例如,數字可能不再是數學上隨機的,或者如果您使用某個基本種子進行初始化,然後期望random()通過多次調用返回多個設置值,則這些數字可能不是您希望返回的那些數字。在使用非線程安全函數的最壞情況下,由於該函數不能同時用於多個線程,因此可能會導致嚴重的異常和/或崩潰。

另請參閱Wikipedia topic on Thread safety

相關問題