通俗地说,当你调用mkStdGen
与附近的种子一起,你会得到两个“相似”的发电机。在你的例子中,你实际上是为每个提供的种子创建新的生成器,并且由于这些种子是1,2,3等,他们将产生类似的流。
当你调用random
有发电机,你实际上是在对的第二个元素得到一个新的发电机:
Prelude System.Random> random (mkStdGen 100) :: (Bool, StdGen)
(True,4041414 40692)
所以一个好主意,就是用这个提供发电机您对random
下一个电话。即,
Prelude System.Random> let (i, gen0) = random (mkStdGen 100) :: (Bool, StdGen)
Prelude System.Random> let (j, gen1) = random gen0 :: (Bool, StdGen)
Prelude System.Random> let (k, gen2) = random gen1 :: (Bool, StdGen)
Prelude System.Random> (i, j, k)
(True, False, False)
因此,为了使一堆随机值,要通过发电机作为国家。您可以通过State
单子什么的手动设置的,或者仅使用randoms
函数,它处理通过发电机状态您:
Prelude System.Random> take 10 $ randoms (mkStdGen 100) :: [Bool]
[True,False,False,False,False,True,True,False,False,True]
如果不特别在意在IO
是(它发生),可以使用randomIO
:
Prelude System.Random> import Control.Monad
Prelude System.Random Control.Monad> replicateM 10 randomIO :: IO [Bool]
[True,True,False,True,True,False,False,False,True,True]
LYAH的This section可能是一个有用的阅读。
为了详细说明这一点:随机发生器不能保证有随机分布在种子值上,但它保证给出产生值序列的随机分布。 – mange