某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,
则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
分析:
根据概率论知识,只要用双方经过4回合战斗体力值之差小于1000的结果方案数除以4回合战斗总的结果方案数即可得到所求概率。因为只有胜负两种状态,可以用1表示
胜,0表示负,由于是4回合战斗,且总是有一方胜利,一方失败,甲乙获胜的概率都是50%,故可以用4bit表示结果,当bit[0]=1时,表示第一场甲胜乙负;bit[0]=0时,表示第一
场甲负乙胜……
解:
#include <stdio.h>
#define ROUND 4
typedef int INT32;
typedef double DOUBLE;
typedef void VOID;
VOID f(VOID)
{
INT32 i,j,n;
INT32 res; //当前结果
INT32 total; //总的结果方案数
DOUBLE powerA, powerB, blood; //A血量,B血量,血量差
total = 2*2*2*2;
n = 0;
for(i=0; i<total; i++)
{
res = i;
powerA = 1000.0;
powerB = 2000.0;
for(j=0; j<ROUND; j++)
{
if(1 == (res & 1)) //甲胜?
{
blood = powerB*1/4;
powerB -= blood;
powerA += blood;
}
else
{
//乙胜
blood = powerA*1/4;
powerA -= blood;
powerB += blood;
}
res >>= 1; //准备下一回合结果
}
if(powerA-powerB<1000.0 && powerA-powerB>-1000.0)
n++;
}
printf("%f\n", (DOUBLE)n/(DOUBLE)(total));
}
INT32 main(INT32 argc, INT32 *argv[])
{
f();
return 0;
}