m面骰子投掷n次,求最大的点的期望值

来源:互联网 发布:植物精灵for mac 编辑:程序博客网 时间:2024/05/02 00:30
/*骰子一共有m个面,第一面有一个点,第二面有两个点,以此类推,第m个面有m个点。
Twilight Sparkle很清楚的知道,每当她丢一次骰子,都有可能随机出现其中的一个面。
并且她还知道,每次扔出的概率都是独立的。现在请你帮助她计算下,当她扔出n次骰子后,所得的最大的点的预期值是多少?


输入值:包含2个整数,m和n (1 ≤ m, n ≤ 105)。


输出值:输出的结果对应于最大的点的预期值,结果误差在10-4范围内都视为正确答案。


示例,比如在假定m=2,n=2的情况下(即骰子只有两面,扔2次的情况):


你第一次扔了1个1,第二次扔了1个2,最大结果为2。
你第一次扔了1个1,第二次扔了1个1,最大结果为1。
你第一次扔了1个2,第二次扔了1个1,最大结果为2。
你第一次扔了1个2,第二次扔了1个2,最大结果为2。
由于出现上述四种情况的概率都为0.25,那么预期值为


(2 + 1 + 2 + 2)* 0.25 = 7/4
*/


#include<iostream>

using namespace std;


class Dice{
int m;//骰子的面数
int n;//投掷的次数
public:
Dice(){
cout << "请输入骰子的面数:";
cin >> this->m;
cout << "请输入投掷的次数:";
cin >> this->n;
}
int getm(){ return this->m; }//获得投掷的面数
int getn(){ return this->n; }//获得投掷的次数

};//并没有必要写类,脑洞有点大


double Expect(int m, int n, int max = 1){//求期望值
double E = 1;//最后一次掷得得值为m
if (n != 1){//不止掷一次
for (int i = 1; i < max; i++){
E += (1.0 / m)*Expect(m, n - 1, max);//最后一次掷得的骰子数为1--max
}
for (int j = max; j < m; j++){
E += (1.0 / m)*Expect(m, n - 1, j);//最后一次掷得的骰子数为max--m-1
}
}
else{//掷一次,这也是给递归赋了一个初值
for (int i = 1; i < max; i++){
E += (1.0 / m)*max;
}
for (int j = max; j < m; j++){
E += (1.0 / m)*j;
}
}
return E;
}
int main(){
Dice d;
cout<<Expect(d.getm(), d.getn(), 1);
cout << endl;
return 0;
}
0 0
原创粉丝点击