这方面的变化是很常见的问题,但我所有的 google-fu 都让我难住了。我想计算掷骰子公平的几率,但我想有效地做到这一点。有很多关于如何做到这一点的例子,但我发现的所有算法在计算上都过于昂贵(指数时间),无法用于大量具有多面的骰子。
简单问题:计算 xy 面骰子上 n 卷的几率。
简单的解决方案:创建滚动的 n 元笛卡尔积,对每个乘积求和,计算和作为目标的次数,做一点除法,瞧。
Go 中的简单解决方案示例: https : //play.golang.org/p/KNUS4YBQC0g
简单的解决方案完美地工作。我将其扩展为允许丢弃最高/最低的 n 个面等情况,结果经得起现场测试。
但是考虑一下{Count: 20,Sides: 20,DropHighest: 0,DropLowest:0, Target: 200}。
如果我用以前的解决方案评估它,我的“表”将有 104 个奇怪的 septillion 单元,并且很容易使 CPU 达到最大值。
有没有更有效的方法来计算大量多面骰子的概率?如果是这样,它是否可以解释更复杂的“成功”条件选择,例如丢骰子?
由于这个美丽网站的存在,我相信这是可能的:https : //anydice.com/program/969
编辑:
最适合我的解决方案是 David Eisenstat 的答案,我将其移植到:https : //play.golang.org/p/cpD51opQf5h