【发布时间】:2011-08-22 08:02:40
【问题描述】:
为了更好地学习 Haskell,我正在尝试编写一个程序,显示 2 个骰子的总和的平均值,滚动 X 次。这在 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 版本中,这是一项简单的任务。我查看了this 的帖子(并且了解了大约 75% 的材料),但是当我将该代码适应这种情况时,对R [Int] 的序列求和不起作用(而且我不确定如何'解开' [Int])。我究竟做错了什么?什么是正确的方法?如何在 Haskell 中实现随机数启蒙?
编辑:除了选择的答案,正如rtperson在下面指出的那样,2个骰子的建模不正确;它实际上应该是从 1 到 6 的两个独立掷骰的总和。
【问题讨论】:
-
结果是 6,SCNR :)
-
其实两个骰子和的期望值是(1+2+3+4+5+6)/6 * 2 = 7。这个练习的重点是学习如何用语言编写程序,而不是统计方面。
-
呵呵 :) 计算一个骰子的期望值后出现舍入误差 :)
-
在链接的帖子中,解开
R [Int]的方法是使用runRandom函数。
标签: haskell random functional-programming