在下面的程序中,为什么每一行都返回 True
?我会想,因为我用不同的种子初始化 mkStdGen
,一些行应该返回 True
而其他行返回 False
:
module Main where
import System.Random
main = do
--why every single line prints "True" ?
print $ fst (random (mkStdGen 1) :: (Bool, StdGen))
print $ fst (random (mkStdGen 2) :: (Bool, StdGen))
print $ fst (random (mkStdGen 3) :: (Bool, StdGen))
print $ fst (random (mkStdGen 4) :: (Bool, StdGen))
print $ fst (random (mkStdGen 5) :: (Bool, StdGen))
print $ fst (random (mkStdGen 6) :: (Bool, StdGen))
print $ fst (random (mkStdGen 7) :: (Bool, StdGen))
print $ fst (random (mkStdGen 8) :: (Bool, StdGen))
print $ fst (random (mkStdGen 9) :: (Bool, StdGen))
print $ fst (random (mkStdGen 10) :: (Bool, StdGen))
即使在源 mkStdGen 中,它也指出“ 不同的论点
应该有可能产生不同的生成器 ":
{- |
The function 'mkStdGen' provides an alternative way of producing an initial
generator, by mapping an 'Int' into a generator. Again, distinct arguments
should be likely to produce distinct generators.
-}
mkStdGen :: Int -> StdGen -- why not Integer ?
mkStdGen s = mkStdGen32 $ fromIntegral s
最佳答案
有趣的是,这刚刚出现在 haskell reddit ( discussion here ) 上,并记录在 this post 中。这篇文章建议从种子中丢弃第一个生成器,如下所示:
better_mkStdGen seed = snd $ randomR (1,6) $ mkStdGen seed
或者你可以使用一个随机包,对分发做出一些声明,比如 mwc-random 。
关于haskell - 使用 System.Random 中的 mkStdGen 生成随机 bool 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21999990/