在阅读了《了解您的Haskell成就伟大》的I / O一章后,我想澄清一下我对Haskell System.Random是如何工作的。

据我了解,类型为StdGen的值的行为类似于生成随机序列的种子。这意味着StdGen类型不过是一种带标签(但随机)的整数,标签为StdGen。这样对吗?

同样,getStdGen向操作系统(或其他可能的东西?)查询起始种子,并且执行该操作的结果存储在gen中。

每当我尝试打印类型为StdGen的值时,我都会看到两个较大的整数始终由空格隔开,如下所示。我会想象这个值将是一个整数。那么,空白代表什么呢?

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

最佳答案

StdGen只是使用两个种子值的伪随机数生成器。

StdGen的作者决定将其Show实例实现为仅显示两个用空格分隔的种子值,而不是使用更常规的格式。

确切的算法由stdNext中的System.Random给出。

10-06 02:28