在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