组合数学计数难题:投掷20个8面骰子,至少有5个骰子相同的概率是多少

3 投票
7 回答
3634 浏览
提问于 2025-04-15 13:15

假设有一个游戏,你要掷20个8面的骰子,这样总共有8^20种可能的结果。要计算某个特定事件发生的概率,我们需要把这个事件发生的方式数除以8^20。

我们可以计算得到恰好有5个骰子显示3的方式数。用(20选5)可以得到3的排列方式数。而7^15则表示在剩下的15次掷骰子中,得到非3的结果的方式数。

number of ways to get exactly 5, 3's = (20 choose 5)*7^15.

这个答案也可以看作是我可以如何重新排列字符串3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0(用(20选5)表示3的数量),再乘以0的总数(假设有7个合法的值),也就是7^15(这样理解对吗)。

  • 问题1:我该如何计算得到恰好5个相同值的骰子的方式数(也就是说,针对所有骰子的值)。注意:如果我只是简单地用上面的答案乘以8,我会得到一个巨大的重复计算结果?

    我明白我可以分别计算每种情况(5个1),(5个2),(5个3),...(5个8),然后把它们加起来(更简单的说就是8*(5个1))。然后再减去重叠的部分(5个1和5个2),(5个1和5个3)...(5个1和5个2)以及...(5个8),但这样看起来会非常麻烦。我希望能有一个更通用的方法,能够适应大量样本和类别的情况。

  • 我该如何计算得到至少5个相同值的骰子的方式数?

    比如111110000000000000000或者11110100000000000002,或者11111100000001110000,或者11011211222222223333,但不能是00001111222233334444或者000511512252363347744。

我在寻找能够解释这些数学原理的答案,或者指向支持这些计算的库(特别是Python模块)。如果能提供详细的例子就更好了。

7 个回答

2

要计算i个s面骰子总和的确切概率分布Fs,i,可以通过将单个骰子的概率分布与自身进行多次卷积来实现。

alt text

这里 alt text 对于所有 alt text 都成立,其他情况下为0。

http://en.wikipedia.org/wiki/Dice

5

我建议你花点时间写一个蒙特卡洛模拟程序,然后在你手动计算数学题的时候让它运行。希望这个蒙特卡洛模拟能在你完成数学计算之前得出结果,这样你就可以检查一下你的答案是否正确。

还有一个稍微快一点的办法,就是创建一个类似于Stack Overflow的网站,专门用来解决数学问题。

3

重复计数的问题可以通过使用包含-排除原理来解决。

我猜结果会是:

Choose(8,1)*P(one set of 5 Xs) 
- Choose(8,2)*P(a set of 5 Xs and a set of 5 Ys) 
+ Choose(8,3)*P(5 Xs, 5 Ys, 5 Zs) 
- Choose(8,4)*P(5 Xs, 5 Ys, 5 Zs, 5 As)

P(set of 5 Xs) = 20 Choose 5 * 7^15 / 8^20
P(5 Xs, 5 Ys) = 20 Choose 5,5 * 6^10 / 8^20

不过,这样做并不能直接解决“同样的东西超过5个”的问题。因为如果你只是把这个方法应用到5、6、7到20的结果加起来,你会重复计算那些比如说有10个1和5个8的情况。

你可能还需要再次使用包含-排除原理来得出第二个答案;所以,至少有5个的概率=P(20个中的一组)+ ... + (P(15个中的一组) - 7*P(5个骰子中的5个)) + ((P(14个中的一组) - 7*P(6个中的5个) - 7*P(6个中的6个))。不过,写出这个的源代码似乎更难了。

撰写回答