某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5:3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 using namespace std; 6 7 int main() 8 { 9 int i,j,k; 10 //二进制枚举,需要概率对半 11 double cnt = 0; 12 for(i=0; i<16; i++) 13 { 14 double a = 1000, b = 2000;//写在for内, 15 for(j=0; j<4; j++)//从0开始 16 { 17 if((i>>j)&1) 18 { 19 a -= a/4; 20 b += a/4; 21 } 22 else 23 { 24 a += b/4; 25 b -= b/4; 26 } 27 } 28 if(fabs(a-b)<1000.0)//内层for外 29 cnt++;//double 也可以自增 30 } 31 cout<<cnt/16.0<<endl; 32 system("pause"); 33 return 0; 34 }
1 #include<stdio.h> 2 #include<math.h> 3 #define N 4 4 double p=0.5;//p表示甲赢的概率是0.5 5 6 double fun(double x, double y, int cur, double k) { 7 double sum=0; 8 if(cur==N) { 9 if(fabs(x-y)<1000) 10 sum+=k; 11 return sum; 12 } 13 sum+=fun(x-x/4,y+x/4,cur+1,k*(1-p));//甲输掉比赛 14 sum+=fun(x+y/4,y-y/4,cur+1,k*p); 15 return sum;//这个必须有,因为当cur!=N时必须也要有返回 16 } 17 int main() { 18 printf("%lf\n",fun(1000,2000,0,1)); 19 return 0; 20 }