2016-05-13 81 views
2

我想了解一下Haskell的System.Random在閱讀了解您對Haskell的好處的I/O章後的工作原理。Haskell中StdGen類型的字符串表示的含義

據我所知,類型StdGen的值的行爲就像隨機序列的生成種子。這意味着StdGen類型不過是一種標記(但隨機)整數,標記爲StdGen。它是否正確?

另外getStdGen查詢操作系統(或其他可能?)的起始種子,執行該操作的結果存儲在gen中。

每當我嘗試打印一個StdGen類型的值時,我會看到兩個總是用空格隔開的大整數,如下所示。我會想象,這個值將是一個整數單個。那麼這個白色空間代表什麼?

Prelude System.Random> gen <- getStdGen 
Prelude System.Random> 
Prelude System.Random> gen 
751404879 1655838864 
Prelude System.Random> 

回答

5

StdGen只是一個使用兩個種子值的僞隨機數生成器。

StdGen的作者已決定將其實例顯示爲由空格分隔的兩個種子值,而不是使用更傳統的格式。

確切的算法由stdNextSystem.Random中給出。

5

從我明白,類型StdGen表現得像一個隨機序列的產生種子的值。

這是正確的。

這將意味着StdGen類型只不過是一種標記(但隨機)整數,標記爲StdGen

這不符合。沒有先驗理由認爲PRNG的內部狀態是完全非結構化的數字。不同的算法使用不同的內部數據結構在StdGen的情況下,你可以read the source

data StdGen 
= StdGen !Int32 !Int32 

對於這個特殊的算法,內部狀態是兩個32位數字。其他算法使用more complicated data structures

而且getStdGen查詢操作系統(或別的可能?)的起始種子

有包含名義上被在程序啓動時初始化爲mkStdRNG 0種子全球IORef;你可以看到細節here

每當我嘗試打印StdGen類型的值時,我會看到兩個總是用空格隔開的大整數,如下所示。那麼這個白色空間代表什麼?

它將包含在StdGen中的兩個Int32值分開。