System.Random在阅读了"了解你是一个伟大的好的哈斯克尔"的I/O章节之后,我想澄清一下我对Haskell的工作原理的理解.
据我所知,类型的值StdGen类似于随机序列的生成种子.这意味着StdGen类型只是一种标记(但随机)整数,标记为StdGen.它是否正确?
还可以getStdGen查询操作系统(或其他可能的?)以获取起始种子,并将执行该操作的结果存储在其中gen.
每当我尝试打印类型StdGenI 的值时,看到两个总是由白色空间分隔的整数,如下所示.我会想到,这个值会是一个单一的整数.那白色空间代表什么呢?
Prelude System.Random> gen <- getStdGen
Prelude System.Random>
Prelude System.Random> gen
751404879 1655838864
Prelude System.Random>
Run Code Online (Sandbox Code Playgroud)
据我所知,类型的值
StdGen类似于随机序列的生成种子.
这是对的.
这意味着
StdGen类型只是一种标记(但随机)整数,标记为StdGen.
这不遵循.没有先验的理由相信PRNG的内部状态是完全非结构化的数字.不同的算法使用不同的内部数据结构 在这种情况下StdGen,您可以阅读来源:
data StdGen
= StdGen !Int32 !Int32
Run Code Online (Sandbox Code Playgroud)
对于此特定算法,内部状态是两个32位数字.其他算法使用更复杂的数据结构.
getStdGen还可以查询操作系统(或其他可能的东西?)以获取起始种子
有一个全局IORef包含mkStdRNG 0在程序启动时从概念上初始化的种子; 你可以在这里看到细节.
每当我尝试打印StdGen类型的值时,我会看到两个大的整数总是被一个空格分隔,如下所示.那白色空间代表什么呢?
它分隔了Int32a中包含的两个值StdGen.
StdGen 只是一个伪随机数生成器,它使用两个种子值.
的作者StdGen已决定实施其显示实例作为只是显示用空格隔开两个种子值,而不是使用更传统的格式.
确切的算法由stdNextin 给出System.Random.