在下面的程序中,为什么每一行都返回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/