2013-11-26 29 views
5

鑑於相同的種子,Haskell的System.Random會爲所有系統,處理器體系結構和Haskell版本提供相同的結果嗎?有沒有承諾這將在未來舉行?我可以期望使用System.Random在所有系統上重現結果嗎?

更具體地說,我可以期待這總是(過去和未來)返回相同的列表?

import System.Random 
rs = randomRs (1, 2^31-1) (mkStdGen 1) 
+4

我很確定沒有這樣的承諾被制定在任何地方,也不會有一個很好的理由。如果你想要一個可重複的連鎖店,爲什麼不直接推出自己的PRNG?如果你基本上使用它作爲一個固定的無限列表,似乎明智的做到這一點。你甚至可以把它作爲'RandomGen'的一個實例,所以它可以以與System.Random'工具完全相同的方式使用。 – leftaroundabout

+2

@leftaroundabout我可以想到很多很好的理由來保證一致的隨機流;這裏的討論也是相關的:http://blog.ezyang.com/2011/05/haskell-not-pure-enough/ – jberryman

+1

除非文檔說明了它,否則它可能不會。特別是對於數量非常大或數量較少(或具有很高精度的實數),其中不同的系統會以不同的方式進行舍入。這可能是可能的,但必須特別謹慎地編程,並且可能會使用專爲不丟失數據而設計的專用號碼類型。不過,我不是科學計算或隨機數生成器的專家。 – AlexMA

回答

0

僞隨機數發生器對於它們「接種」的值是確定性的。這就是爲什麼mkStdGen是一個純粹的功能。如果你真的擔心,是的,最好不要依賴不變量而不是圖書館規範的一部分。實際上,我希望證明,在這種情況下,僞隨機性與它無關 - 問題歸結爲純粹的沒有機器特定類型的Haskell是否在不同平臺上評估相同。

StdGen當前用Int32s實現。當然,從這些固定大小的整數中,可以對其他類型的數據進行採樣,但隨機數發生器本身僅使用與機器無關的數據類型。根據Integer類源,四捨五入也不會留給機器(對於C整數類型也是如此)。使用fixnums,與flonums不同的是,從打破標準中獲得的性能優勢不那麼顯着,並且程序正確性風險也大得多。

從StdGen退後一步,特別是強大的密碼學需要一個強大的僞隨機標準 - 無意的體系結構特定行爲可能是一個重要的安全整體,而有意識的架構特定行爲基本上等於寫作,維護,並證明正確的多個發電機。如果額外的努力是值得的,那麼也可能值得做廣告/記錄。

最後,在Hackage上有很多僞隨機數生成器(System.Random不應該是最快或最安全的AFIAK),如果一個目標加密使用不提供你想要的不變量,我會感到驚訝。

+0

如果世界上存在多個安全PRNG,系統特定的PRNG不是安全漏洞。 – misterbee

+0

好點,我希望現在更清楚 – Sonarpulse

相關問題