我想澄清一下我对Haskell的System.Random
如何在阅读了“了解你为一个伟大的好人的Haskell”的I / O章节后的理解。
根据我的理解,类型StdGen
的值的行为类似于随机序列的生成种子。这意味着StdGen
类型只是一种标记(但随机)整数,标记为StdGen
。它是否正确?
同样getStdGen
向操作系统(或其他可能的东西?)查询起始种子,执行该操作的结果存储在gen
中。
每当我尝试打印StdGen
类型的值时,我会看到两个大的整数总是被一个空格分隔,如下所示。我原以为这个值应该是单个整数。那白色空间代表什么呢?
Prelude System.Random> gen <- getStdGen
Prelude System.Random>
Prelude System.Random> gen
751404879 1655838864
Prelude System.Random>
答案 0 :(得分:6)
根据我的理解,
StdGen
类型的值的行为类似于随机序列的生成种子。
这是正确的。
这意味着
StdGen
类型只是一种标记(但随机)整数,标记为StdGen
。
这不遵循。没有先验的理由相信PRNG的内部状态是完全非结构化的数字。不同的算法使用不同的内部数据结构如果是StdGen
,您可以read the source:
data StdGen
= StdGen !Int32 !Int32
对于此特定算法,内部状态是两个32位数字。其他算法使用more complicated data structures。
getStdGen还会查询操作系统(或其他可能的?)以获取起始种子
有一个全局IORef
包含在程序启动时被概念初始化为mkStdRNG 0
的种子;你可以看到详细信息here。
每当我尝试打印StdGen类型的值时,我会看到两个大的整数总是被一个空格分隔,如下所示。那白色空间代表什么呢?
它分隔了Int32
中包含的两个StdGen
值。
答案 1 :(得分:5)
StdGen
只是一个伪随机数生成器,它使用两个种子值。
StdGen
的作者决定将其Show实例实现为仅显示由空格分隔的两个种子值,而不是使用更传统的格式。
确切算法由System.Random
中的stdNext
提供。