对于类似于我的问题,有几个很好的答案,但所有这些问题(我试图尽可能多地使用它们)都使用System.random库。在Haskell中编写代码以创建包含没有此类库的随机整数的列表有什么好主意?我认为在使用System.random时了解幕后发生的事情很有趣。
答案 0 :(得分:1)
前奏中没有暴露熵的来源,因此只使用前奏来制作随机数的唯一方法是随机性来自其他地方。您可以阅读自己的外部熵源,或使用现有的熵/dev/urandom
。在二进制模式下打开/dev/urandom
以正确阅读它会偏离前缀System.IO
(或更好Data.Bytestring
)。
如果没有System.IO
,您可以将自己约束到您理解井的表示的unicode字符集部分。对我来说,'a'
到'p'
的小写字母为0x61
到0x70
。
randomNibbles :: IO [Int]
randomNibbles = map (`mod` 16) . filter (> 6 * 16) . filter (<= 7*16) . map fromEnum <$> readFile "/dev/urandom"
从根本上说,从外部世界获取熵的唯一方法是通过I / O来观察外部世界。