3

假设一个游戏中一个人掷出 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)乘以我们为零的值的总数(假设 7 个合法值)7^15(这是正确的)。

  • 问题 1:我如何计算获得完全相同值的 5 个骰子的方法数量(即,对于所有骰子值)。注意:如果我只是天真地使用上面的第一个答案并乘以 bt 8,我会得到大量的重复计算吗?

    我知道我可以解决每种情况 (5 1's), (5, 2's), (5, 3's), ... (5's, 8) 对它们求和(更简单地说 8*(5 1's) )。然后减去重叠数的总和 (5 1's) 和 (5 2's), (5 1's) 和 (5 3's)... (5 1's) 和 (5, 2's) 和 ...和 ​​(5, 8's)但这似乎非常混乱。我会以一种扩展到大量样本和大量类的方式对此进行概括。

  • 如何计算获得至少5 个相同值的骰子的方法数?

    所以 111110000000000000000 或 11110100000000000002 或 11111100000001110000 或 11011211222222223333,但不是 00001111222233334444 或 0630511514225。

我正在寻找解释数学或指向支持此的库(尤其是 python 模块)的答案。细节和例子的加分。

4

7 回答 7

5

我建议您花一点时间编写蒙特卡洛模拟,并在您手动计算数学时让它运行。希望蒙特卡洛模拟能够在您完成数学运算之前收敛,并且您将能够检查您的解决方案。

稍微快一点的选项可能涉及为数学问题创建一个 SO 克隆。

于 2009-07-29T19:53:20.943 回答
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 个相同”的问题,就好像您只是简单地将 this 的结果相加到 5,6,7..20;如果你有 10 个 1 和 5 个 8 的情况,你会多算。

您可能可以再次应用包含排除来得出第二个答案;因此,P(至少 5 个)=P(一组 20 个)+ ... +(P(一组 15 个)- 7*P(一组 5 个来自 5 个骰子))+((P(一组of 14) - 7*P(一组 5 来自 6) - 7*P(一组 6 来自 6))。为此提供源代码证明自己更加困难。

于 2009-07-29T19:48:39.393 回答
2

i s 面骰子之和的准确概率分布 Fs,i 可以计算为单骰子概率分布与其自身的重复卷积。

替代文字

全部在哪里 ,否则替代文字 为0。替代文字

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

于 2009-07-29T19:12:59.027 回答
2

如果您必须将其概括(获得确切的公式),这个问题真的很难。

但无论如何,让我解释一下算法。如果你想知道

获得 5 个相同值的骰子的方法数

你必须改写你以前的问题,因为

计算获得值 3 的 5 个骰子的方法数,并且没有其他值可以重复 5 次

为简单起见,我们将函数 F(20,8,5) (5 dice, all values) 称为第一个答案,将 F(20,8,5,3) (5 dice, value 3) 称为第二个答案。我们有 F(20,8,5) = F(20,8,5,3) * 8 + (一个值重复 5 次以上的事件)

所以如果我们能得到 F(20,8,5,3) 它应该很简单不是吗?嗯……没那么多……

首先,让我们定义一些变量: X1,X2,X3...,Xi ,其中 Xi=我们得到骰子 i 的次数

然后:

F(20,8,5)/20^8 = P(X1=5 or X2=5 or ... or X8=5, with R=20(rolls) and N=8(dice number))

, P(statement) 是编写概率的标准方式。

我们继续:

F(20,8,5,3)/20^8 = P(X3=5 and X1<>5 and ... and X8<>5, R=20, N=8) 
F(20,8,5,3)/20^8 = 1 - P(X1=5 or X2=5 or X4=5 or X5=5 or X6=5 or X7=5 or X8=5, R=15, N=7)  
F(20,8,5,3)/20^8 = 1 - F(15,7,5)/7^15

递归:

F(15,8,5) = F(15,7,5,1) * 7  
P(X1=5 or X2=5 or X4=5 or X5=5 or X6=5 or X7=5 or X8=5, R=15, N=7) = P(X1=5 and X2<>5 and X4<>5 and .. and X8<>5. R=15, N=7) * 7

F(15,7,5,1)/7^15 = 1 - F(10,6,5)/6^10 F(10,6,5) = F(10,6,5,2) * 6

F(10,6,5,2)/6^10 = 1 - F(5,5,5)/5^5
F(5,5,5) = F(5,5,5,4) * 5

那么... F(5,5,5,4) 是在 5 次掷骰中获得 5 个价值为 4 的骰子的方法数,例如没有其他骰子重复 5 次。在总共 5^5 中,只有 1 种方式。那么概率是 1/5^5。

F(5,5,5) 是在 5 次掷骰中获得 5 个任意值(5 个值中)的骰子的方法数。显然是 5。那么概率是 5/5^5 = 1/5^4。

F(10,6,5,2) 是在 10 次掷骰中获得 5 个值为 2 的骰子的次数,例如没有其他骰子重复 5 次。F(10,6,5,2) = (1-F(5,5,5)/5^5) * 6^10 = (1-1/5^4) * 6^10

嗯......我认为它在某些方面可能是不正确的,但无论如何,你明白了。我希望我可以使算法易于理解。

编辑: 我做了一些检查,我意识到当你得到一个以上的值恰好重复 5 次时,你必须添加一些情况。你没时间解决那部分...

于 2009-07-29T21:38:14.467 回答
1

递归解决方案:

Prob_same_value(n) = Prob_same_value(n-1) * (1 - Prob_noone_rolling_that_value(N-(n-1)))
于 2009-07-29T19:29:02.953 回答
1

这就是我的想法...

如果你只有 5 个骰子,那么你只有八种方法可以得到你想要的。

对于这八种方式中的每一种,其他 15 个骰子的所有可能组合都有效。

所以 - 我认为答案是:(8 * 8 15) / 8 20

(至少5个相同的答案。)

于 2009-07-29T19:44:56.843 回答
1

我相信您可以使用在 n 个事件中出现 x 次的公式:

P = 概率^n * (n!/((n - x)!x!))

所以最终结果将是从 0 到 n 的结果之和。

我真的没有看到任何简单的方法可以将它组合成一个不那么混乱的步骤。通过这种方式,您也可以在代码中阐明公式。不过,您可能必须编写自己的阶乘方法。

  float calculateProbability(int tosses, int atLeastNumber) {
    float atLeastProbability = 0;
    float eventProbability = Math.pow( 1.0/8.0, tosses);
    int nFactorial = factorial(tosses);

    for ( i = 1; i <= atLeastNumber; i++) {
      atLeastProbability += eventProbability * (nFactorial / (factorial(tosses - i) * factorial(i) );
    }
  }
于 2009-07-29T19:52:36.000 回答