我有這個長而複雜的源代碼,它使用一個RNG與修復種子。C++。 RNG在兩臺使用相同種子的不同機器中給出不同的隨機變量有可能嗎?
此代碼是模擬器,此模擬器的參數是由此RNG給出的隨機值。 當我在同一臺機器上執行代碼時,無論我做了多少次嘗試,輸出都是一樣的。但是當我在兩臺不同的機器上執行這些代碼並且比較兩臺機器的輸出時,它們是不同的。
是否有可能兩臺不同的機器使用相同的隨機數生成器和相同的種子以某種方式產生不同的輸出?
編譯器版本,庫和操作系統是相同的。
我有這個長而複雜的源代碼,它使用一個RNG與修復種子。C++。 RNG在兩臺使用相同種子的不同機器中給出不同的隨機變量有可能嗎?
此代碼是模擬器,此模擬器的參數是由此RNG給出的隨機值。 當我在同一臺機器上執行代碼時,無論我做了多少次嘗試,輸出都是一樣的。但是當我在兩臺不同的機器上執行這些代碼並且比較兩臺機器的輸出時,它們是不同的。
是否有可能兩臺不同的機器使用相同的隨機數生成器和相同的種子以某種方式產生不同的輸出?
編譯器版本,庫和操作系統是相同的。
當然,RNG可能會將機器特定的數據與種子(如網卡地址)組合起來生成隨機數,這當然是可能的。它基本上是實現特定的。
如果它是一個僞隨機生成器,它只使用種子來產生數字序列,那麼根據定義它們不能不同。但是,如果你使用的是使用某種機器來擾亂種子,或者很簡單,使用不同的算法,那當然很有可能。您正在使用哪個實現,如果它是標準庫實現,它們是否都是相同的版本?
這個問題指出庫,編譯器和操作系統是相同的。 – 2009-01-21 15:44:12
Still - 可能是Linux/glibc/gcc具有不同的浮點設置。 – MSalters 2009-01-22 13:42:11
也許這是一個小/大端問題,或代碼以某種方式檢測處理器。最簡單的方法是使用斷點或類似的調試例程來觀察播種程序和RNG本身的工作。
由於他們確實給出了不同的結果,他們顯然可能會給出不同的結果。易於回答的問題,接下來!
說真的:如果不知道RNG的源代碼,很難知道您是在觀察錯誤還是功能。但這聽起來像是所討論的RNG使用來自其他地方的第二顆種子,例如當前時間或一些與硬件相關的值,如網卡的MAC地址。
它很大程度上取決於您正在使用的RNG。諸如random(3)
或rand48(3)
系列之類的東西被設計爲在以相同的種子運行時返回相同的序列。現在,如果您使用的RNG輸出爲/dev/random
,則所有投注都將關閉,結果將會不同。
是的。例如,有浮點RNG,其結果可能取決於您的CPU是否正確實施IEEE浮點數(在ISO C++中不保證)。此外,溢出80位的影響會加倍記憶可能會影響結果。
關於「種子」的概念也存在一些可能的混淆。有些人將種子定義爲所有輸入來設置RNG的初始狀態。其他人將其限制爲只有代碼中的明確輸入,並排除來自例如硬件資源或/ dev/random。
如果您需要可以在機器之間重複的操作,請嘗試使用Boost Random Number Library。
可以請你說出你正在使用哪個PRNG(庫/函數),如果它是開源的,我想看看好奇心的源代碼.. :) – falstro 2009-01-21 14:13:45
通過'compare the outputs' ,你在比較rng還是模擬的輸出? – 2009-01-21 14:30:28