使用 randomR 生成奇怪的有偏随机数
Weird biased random number generation with randomR
我想我在这里做错了什么:
ghci> take 10 $ randomRs (1,6) (mkStdGen 2)
[6,4,1,5,4,2,2,2,2,3]
ghci> take 10 $ randomRs (1,6) (mkStdGen 3)
[6,4,5,4,4,2,1,1,5,1]
ghci> take 10 $ randomRs (1,6) (mkStdGen 5)
[6,2,2,1,3,2,5,1,5,4]
ghci> take 10 $ randomRs (1,6) (mkStdGen 7)
[6,1,4,5,3,2,3,6,6,6]
ghci> take 10 $ randomRs (1,6) (mkStdGen 11)
[6,4,4,6,1,2,6,5,6,5]
为什么第一个随机数总是"randomly" 6 ...?
从 a 到 z 的字母与 "n" 相同的模式:
ghci> take 10 $ randomRs ('a','z') (mkStdGen 13)
"nnofwbxbtw"
ghci> take 10 $ randomRs ('a','z') (mkStdGen 17)
"novkmtfugl"
ghci> take 10 $ randomRs ('a','z') (mkStdGen 19)
"nhurafjvey"
我通过 LYAHFGG(关于随机性的第 9 章)偶然发现了这个工作,但真的无法理解它。我希望种子之间没有模式。
这些种子都是非常小的数字,比maxBound :: Int
小得多。因此,它们非常不是随机生成器的真实世界内部状态的代表性样本。基本上,randomR
的第一个结果只有 "as random as the seed",WRT 各自的范围。
如果您希望第一个结果有所不同,您需要对种子进行适当的散列处理,这样这些值才能很好地分散在允许的整数范围内。最简单的方法是丢弃第一个结果。
System.Random.StdGen
是一个可怕的发电机,早该被取代。甚至有一些明显错误的快速检查属性,由于 StdGen
的质量差,经过数千次检查后仍然通过 - 这是通过良好的播种完成的。
有许多强大的密码生成器和统计生成器。考虑使用 tf-random
包来替代 StdGen
,DRBG
用于加密随机生成器,或 mersenne-random-pure64
用于快速且统计上良好的生成器。
我想我在这里做错了什么:
ghci> take 10 $ randomRs (1,6) (mkStdGen 2)
[6,4,1,5,4,2,2,2,2,3]
ghci> take 10 $ randomRs (1,6) (mkStdGen 3)
[6,4,5,4,4,2,1,1,5,1]
ghci> take 10 $ randomRs (1,6) (mkStdGen 5)
[6,2,2,1,3,2,5,1,5,4]
ghci> take 10 $ randomRs (1,6) (mkStdGen 7)
[6,1,4,5,3,2,3,6,6,6]
ghci> take 10 $ randomRs (1,6) (mkStdGen 11)
[6,4,4,6,1,2,6,5,6,5]
为什么第一个随机数总是"randomly" 6 ...?
从 a 到 z 的字母与 "n" 相同的模式:
ghci> take 10 $ randomRs ('a','z') (mkStdGen 13)
"nnofwbxbtw"
ghci> take 10 $ randomRs ('a','z') (mkStdGen 17)
"novkmtfugl"
ghci> take 10 $ randomRs ('a','z') (mkStdGen 19)
"nhurafjvey"
我通过 LYAHFGG(关于随机性的第 9 章)偶然发现了这个工作,但真的无法理解它。我希望种子之间没有模式。
这些种子都是非常小的数字,比maxBound :: Int
小得多。因此,它们非常不是随机生成器的真实世界内部状态的代表性样本。基本上,randomR
的第一个结果只有 "as random as the seed",WRT 各自的范围。
如果您希望第一个结果有所不同,您需要对种子进行适当的散列处理,这样这些值才能很好地分散在允许的整数范围内。最简单的方法是丢弃第一个结果。
System.Random.StdGen
是一个可怕的发电机,早该被取代。甚至有一些明显错误的快速检查属性,由于 StdGen
的质量差,经过数千次检查后仍然通过 - 这是通过良好的播种完成的。
有许多强大的密码生成器和统计生成器。考虑使用 tf-random
包来替代 StdGen
,DRBG
用于加密随机生成器,或 mersenne-random-pure64
用于快速且统计上良好的生成器。