2016-05-13 84 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值分开。