【发布时间】:2020-08-12 19:29:42
【问题描述】:
我保证这不是只是另一个掷骰子作业问题。我实现了一个函数来计算在滚动nm 面骰子时获得小于和s 的概率。我的函数适用于n 的小值,但我发现n 的大值的结果很奇怪。见附图。有人知道发生了什么吗?
我的概率函数
probability <- function(s, m, n) {
i <- 0:((s-1-n) / m)
m^(-n) * sum((-1)^i * choose(n, i) * choose(s - 1 - i * m, n))
}
从 ~ n > 80 开始中断
n <- 1:90 # number of dice
m <- 6 # number of sides
s <- floor(mean(1:m)*n) # sum of faces
p <- mapply(probability, s = s, m = m, n = n)
plot(n, p, main = paste("probability of rolling less than floor(", mean(1:m),"* n) as sum of n rolls of a", m, "sided dice"))
【问题讨论】:
-
雪上加霜,我的朋友已经在 Mathematica 中实现了相同的算法,并且对于较大的 n 值没有任何问题
-
那些
choose数字变得巨大。例如choose(80,40)。您的公式在数值上不稳定。也许尝试在对数尺度上进行计算。 -
对于大的
n,choose将完全失去精度。也许您可以阅读有关stackoverflow.com/a/40527881/12158757 的替代方案 -
谢谢,我正在努力实现 ramanujan 的近似,但在矢量化函数并让它使用
base::choose来处理较小的n和k值时遇到了麻烦。我将编辑问题以包含我的进度。 -
修复了 NaN 问题,但精度仍然下降 ~ n > 80