【发布时间】:2018-11-14 08:46:23
【问题描述】:
这方面的变化是很常见的问题,但我所有的 google-fu 都让我感到困惑。我想计算掷骰子公平的几率,但我想有效地做到这一点。有很多例子可以说明如何做到这一点,但我发现的所有算法在计算上都过于昂贵(指数时间),无法处理大量具有多面的骰子。
简单问题:计算在 x y 面骰子上掷出 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
【问题讨论】:
-
The dice roll sum problem 很好地解释了 N 个 6 面骰子的问题。如果您理解那篇文章,您应该能够将其推广到 n 面骰子。另请参阅第一篇文章引用的mathworld.wolfram.com/Dice.html。
-
@AaronSmall 独立骰子和的分布是每个骰子上的数字分布的卷积。在这种情况下,多项式乘法给出与卷积相同的结果,但卷积是更一般的概念(并且不再复杂)。见:en.wikipedia.org/wiki/Convolution
-
@JimMischel 我不知道lucamoroni.it/the-dice-roll-sum-problem ,它似乎不必要地复杂。仅仅为了得到骰子的总和并不需要所有的组合。
-
@RobertDodier 这是对该主题的全面回顾,重点是理解其背后的数学原理。是的,如果你想要的只是一个公式,那就太复杂了。
-
@AaronSmall 你能帮我理解如何打算使用 DropHighest 和 DropLowest。您的意思是排除高于 DropHighest 和低于 DropLowest 的面孔吗?或者,在所有骰子中,无论它们显示的是什么,都排除了 DropHighest 最高的骰子,而 DropLowest 最低的骰子被排除在外? (如果是后者,如何处理关系?)感谢您提供任何信息。
标签: algorithm go probability dice