某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5:3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
- /*******************************
- 对甲进行分析,总共有2^4种结果。
- 甲赢得场数的情况有0,1,2,3,4.
- 0:(4,0)=1
- 1:(4,1)=4
- 2:(4,2)=6
- 3:(4,3)=4
- 4:(4,4)=1
- 加起来刚好就是16种结果。
- 每种情况的概率就是1/16
- ********************************/
- #include <stdio.h>
- #include <math.h>
- int main(void)
- {
- double tax;
- double x,y;
- int i;
- int count=0;
- int temp;
- int j;
- count = (int)pow((double)2,(double)4);
- tax = 0;
- for (i=0; i<count;i++)// 0----1111
- {
- x=2000;
- y=2000;
- for (j=0; j<4; j++)
- {
- temp=1;
- temp=temp<<j;// 0001 0010 0100 1000
- /************************************
- 甲胜的情况:4盘都输、赢1盘、赢2盘..赢4盘
- i=0.4输。
- i=1,2,4,8.1赢
- i=3,5,6,9,10,12.2赢
- i=7,11,13,14.3赢
- i=15.4赢
- ************************************/
- if ((i&temp) == temp)//
- {
- x+=y/4;
- y-=y/4;
- }
- else
- {
- x-=x/4;
- y+=x/4;
- }
- }
- printf("%d %f/n", i, fabs(x-y));
- if (fabs(x-y)<1000)
- tax+=1.0/16;
- }
- printf("%lf",tax);
- }