某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。
游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
分析:
4个回合,可以看成如下的组合,0表示甲战斗失败,1表示甲战斗胜利
甲乙胜利概率是1/2,所以每种01组合的概率相同
甲1回都没胜利,概率是1/2^4 = 1/16
0 0 0 0 >1000(双方体力值相差>1000)
甲胜利1回,概率是4*1/16=1/4
0 0 0 1 计算体力值差
0 0 1 0
0 1 0 0
1 0 0 0
甲胜利2回
0 0 1 1 计算体力值差
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
甲胜利3回
0 1 1 1 计算体力值差
1 0 1 1
1 1 0 1
1 1 1 0
甲4回全胜
1 1 1 1 <1000
在这16种情况中,体力值差<1000的占的比例就是所求的概率
代码:
方法一:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double count=0,f;
for (int i=0;i<16;++i){
double x=1000,y=2000;
for (int k=0;k<4;++k){
int t=i>>k&1;
if (t == 0){
x-=x/4;
y+=x/4;
}
else{
x+=y/4;
y-=y/4;
}
}
if (fabs(y-x)<1000)
++count;
}
f=count/16;
cout<<f<<endl; while(1);
}