haskell - 使用 System.Random 中的 mkStdGen 生成随机 bool 值

标签 haskell random

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

相关文章:

go - 如何创建线程安全的 rand.Source?

c# - 随机不是那么随机,在 Windows Phone 7 上有随机类

python - 回滚 python 中的随机数生成器?

haskell - Hspec:发现、自定义 main 以及将参数传递给规范

haskell - 为什么我的并行遍历 Haskell 程序会泄漏内存?

haskell - 通过: Cannot derive well-kinded instance推导

c++ - xorshift128+ 算法的真正定义是什么?

haskell - 使用 ghci 导入 Ratio 模块

haskell - 重写规则不会触发匹配多个实例方法的规则

c++ - rand() 函数生成错误范围内的数字