C++中掷N次骰子后点数的最大值


任务是计算掷N次M面的骰子后可以预期的点数最大值。

骰子的第一个面包含1个点,第二个面包含2个点,以此类推。同样,第M个面包含M个点。

每个面出现的概率为1/M。

让我们用一个例子来理解我们要做什么:

输入 - M=2, N=3

输出 - 1.875

解释 - 骰子有2个面 = {1, 2}

如果掷骰子3次,则样本空间将为 = MN = 23

{(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2,)
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2,)}
Maximum number in (1, 1, 1) = 1
Maximum number in (1, 1, 2) = 2
Maximum number in (1, 2, 1) = 2
Maximum number in (1, 2, 2) = 2
Maximum number in (2, 1, 1) = 2
Maximum number in (2, 1, 2) = 2
Maximum number in (2, 2, 1) = 2
Maximum number in (2, 2, 2) = 2
Probability of each case = 1/23 = 0.125
Therefore, expectation of maximum number = (1+2+2+2+2+2+2+2) * (0.125) = 1.875

输入 - M=2, N=2

输出 - 1.75

下面程序中使用的算法如下:

  • 可以使用公式iN – (i-1)N通过其前一个数字找到某个数字可能出现的最大情况数。

    例如,如果M=4且N=2,则最大值为4的情况总数为42 – (4-1)2 = 7。

    因此,最终答案将是对从1到M的每个元素应用此公式:

    (i * (iN – (i - 1)N )) / MN 并将它们加起来。

  • 在MaxExpect()函数中,初始化一个double类型的变量max = 0来存储总和。

  • 然后从i=M循环到i>0

  • 在循环内部应用上述公式,并将所有结果值添加到变量max中。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
double MaxExpect(double M, double N){
   double max = 0.0, i;
   for (i = M; i; i--)
      /*formula to find maximum number and
      sum of maximum numbers*/
      max += (pow(i / M, N) - pow((i - 1) / M, N)) * i;
      return max;
}
int main(){
   double M = 2, N = 3;
   cout << MaxExpect(M, N);
   return 0;
}

输出

如果我们运行上面的代码,我们将得到以下输出:

1.875

更新于:2020年8月17日

118次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告