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

10-09 04:35