有没有办法在Haskell中概括多个生成器和随机数

好奇

我正在学习Haskell。Haskell中大量骰子骰的平均值如何使以下代码与多个骰子(例如8个骰子)一起工作,而不是反复创建let rolls..3,4,5 ... etc ...

module Dice where
import System.Random
import Data.List

dice = do
    g <- getStdGen
    b <- newStdGen
    let trials = 1000
    let rolls1 = take trials (randomRs (1,6) g :: [Int])
    let rolls2 = take trials (randomRs (1,6) b::[Int])
    let rolls = zipWith (+) rolls1 rolls2
    let average = div (foldl' (+) 0 rolls) trials
    print average
开支

System.Random模块提供了一些基本的原语,但是(我认为)它缺少适当的monadic接口。更确切地说,它提供了基于IO的monadic接口,但是缺少基于State的monadic接口。但是,后者很容易定义

无论如何,如果要坚持使用IO和标准生成器,则可以这样写:

-- (untested code)

rollDie :: Int -> IO Int
rollDie n = randomIO (1,n) -- implicitly uses the global generator

rollManyDice :: Int -> Int -> IO [Int]
rollManyDice howMany n = replicateM howMany (rollDie n)

main :: IO ()
main = do
   dice <- rollManyDice 20 6
   putStrLn $ "Here's 20 6-sides dice : " ++ show dice

其中replicateM执行howMany一次单子动作,将所有结果收集在列表中。这里的monad是IO,但可以是任何东西。

这是一种很好且简单的方法,但是IO上面类型有点太多,这使我们无法rollDie从非IO代码进行调用一个State基础的解决方案不会有这种limination

type R a = State StdGen a

rollDie :: Int -> R Int
rollDie n = state $ randomR (1,n) -- uses the generator inside the State monad

rollManyDice :: Int -> Int -> R [Int]
rollManyDice howMany n = replicateM howMany (rollDie n)

main :: IO ()
main = do
   g <- getStdGen
   let dice = evalState (rollManyDice 20 6) g
   putStrLn $ "Here's 20 6-sides dice : " ++ show dice

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法在BigQuery Standard SQL中播种随机数生成过程

有没有办法在java中制作一个随机数生成器,它比另一个更有可能落在一个数字上?

有没有办法区分这个迭代器和这个生成器?

有没有办法在javascript中创建类似python的生成器?

没有重复修改的随机数生成器?

Java 中有没有办法按照固定的均值和标准差生成随机数?

有没有一种方法可以让Swift 4.2随机数生成器成为种子

有没有一种方法可以为随机数生成器中的样本分配概率?

有没有一种简单的方法可以使用Fortran中的随机数生成器进行并发计算?

有没有办法减少与其调用者通信的无限生成器中的产量?

有没有办法将变量从Javascript中的其他模块传递给导出的生成器?

有没有办法在嵌套 for 循环中访问生成器中每个元素的属性?

有没有办法测试闭包是否也是生成器?

有没有办法从这个名称生成器导入结果?

有没有办法重新打开 ML.NET 模型生成器?

C#:有没有办法在显示后停止再次生成随机数

有没有办法两次使用随机链接?即像维基百科随机文章生成器,但用于不同的站点

有没有办法从随机数中找到最大的数?

带有更新的加权随机数生成器

我的随机数生成器有问题

有没有一种方法可以将随机数生成器存储为特征对象?

为具有 if 和 else 条件的随机数生成器编写脚本

有没有办法只生成随机的“时间”?

有没有办法使用Laravel查询生成器重写此原始SQL查询

替代密钥生成器状态文件,有没有办法从其他编语言读取文件?

为什么从伪随机数生成器中只有0.000000?

php中带有twist的随机数生成器

有没有办法概括这个TrieMap代码?

有没有办法在应用程序被杀死或在后台使用通知兼容生成器在 android 中显示通知?