为了更好地学习Haskell,我正在尝试编写一个程序,显示掷X次2个骰子的和的平均值。在C、Java、Python中,这相当简单,但是在Haskell中我卡住了。以下是一个天真的尝试:
import System.Random
main = do
g <- getStdGen
let trials = 10000000
let rolls = take trials (randomRs (2, 12) g :: [Int])
let average = div (sum rolls) trials
print average
对于少量试验,程序可以正常运行。但当我使用一千万次试验运行此代码时,会出现错误:
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
写这个程序的方法肯定有更好的办法。在C、Java和Python版本中,这是一项简单的任务。我看过这篇文章(大约理解了其中75%的内容),但当我将那段代码适应到这种情况下时,对一个R [Int]
序列求和没有起作用(而且我不确定如何“解开”[Int])。我做错了什么?正确的方法是什么?如何在Haskell中达到随机数启示?
编辑:除了已选择的答案外,正如rtperson在下面指出的那样,模拟两个骰子的方法是不正确的;它实际上应该是从1到6独立投掷两次的总和。
R [Int]
的方法是使用runRandom
函数。 - Dan Burton