Haskell中StdGen类型的字符串表示的含义

时间:2016-05-13 00:36:20

标签: haskell random

我想澄清一下我对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> 

2 个答案:

答案 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提供。