关于概率的问题
问题:
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
看后没什么思路,这个概率该怎么求?请说下各位思路,最好用伪代码写,不要统统文字描述。
我还是随机模拟了100w次,看下概率。大概是59.00多
代码:
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#define TEST_NUM 1000000//模拟次数intmain(){ float a = 1000; //a体力 float total = 3000; //总体力 float b; int good_num = 0; //结果两者差值小于1000的次数 long int i; int j; srand((unsigned int)time((time_t *)0)); for(i = 0; i < TEST_NUM; ++i) { for(j = 0; j < 4; ++j) a = rand()%2 ? a + (total -a)/4 : 3 * a/4; //rand()%2 生成0,1概率各为50% b = total -a; if (fabs(a-b) < 1000) //符合则计数 good_num++; } printf("%.2f\n", (float)(good_num)/TEST_NUM*100); exit(0);}[解决办法]
没空写代码,思路:因为战斗四次,胜败是有序的,所有最后可能有2的4次方16种结果,并且每种结果发生的概率是相同的(幸亏是相同的),这样可构成一棵深度为5(第一层为还没战斗时状态)的满二叉树,统计下最后十六种相差1000以内的个数x除以16就可以了。