炉石概率论 学霸们答疑精灵龙世纪难题
在果壳网的问答板块里,玩家“宇宙第一统治者”质疑精灵龙问题50%这个答案的合理性。
如果对方场上只有一只精灵龙,那么你使用奥术飞弹打死它的概率有多大?
这应该是炉石史上最经典的数学问题,被争议多年后,大家都知道了这个答案是50%。
而最近,在果壳网的问答板块里,又有玩家“宇宙第一统治者”开始质疑50%这个答案的合理性,让我们来看看吧!
问题原文
我觉得这题精灵龙不简单,编程得到的结果匪夷所思,接近49.93%但是不到50%。求助大神!
C++代码奉上(计算精灵龙死亡概率),编程非常渣。
#include
#include
#include
#include
int aa=30;
int bb=2;
void er();
void er()
{
int ll=rand()%2;
if(ll==0)
{
aa=aa-1;
return ;
}
if(ll==1)
{
bb=bb-1;
return ;
}
}
void sandan();
void sandan()
{
if(bb<=0)
{
aa=aa-1;
return ;
}
if(bb>0)
{
er();
return;
}
}
void main()
{
srand(time(NULL));
int ss;
int qq=0,jj=0;
while(jj<10000000)
{
fflush(stdin);
sandan();
sandan();
sandan();
if(bb==0)
{
qq=qq+1;
}
aa=30;
bb=2;
jj=jj+1;
}
printf("在10000000次试验中,精灵龙死了%d次",qq);
}
结果图,测试结果并不是50%
回答精选
果壳网友饭小盆的回答
奥蛋每次攻击都是独立判定的,但是对于这个特定模型来说,只有一种情况下,概率会有不同。。。那就是当前两次伤害已经打死精灵龙,最后一次就只能打脸了。。。
用文字表示的话,打脸是0,精灵龙是1
A000
B001
C010
D011
E100
F101
G110
前面6种都是12.5%的概率出现,最后一种则是25%,那么统计一下出现两次1的情况,就是D、F和G,其中D和F都是12.5%的概率,G是25%,加起来一共50%
如果你采用多次迭代的方法进行统计,那么实际得到的结果跟理论计算确实会有一定的差距。。不妨试试把实验次数提高一些。。。
再附个二叉树的图,省略了根节点
另外给你说个奇怪的事。
以前山口山5.4的PTR上进行过一个测试,武器战把精通弄成100%(精通效果是任何攻击都有几率造成一次额外伤害,伤害数值固定,精通本身不会触发精通),那么也就是说,我在一次实验中,其它伤害的攻击次数和触发的精通次数应该是一样的。。。
然而实际结果并不是这样。攻击了500多次。精通触发数量比其他攻击少了几十次。具体原因未知。
果壳网友junglerubik的回答
你们啊,一堆答案都没答到要点。
楼主其实就是进行了一次蒙特卡洛实验。
而monte carlo出来的数字是有一个置信区间的。
假设第i次随机实验得到的结果为 (根据题意 就是精灵龙死了没有)。 是一个随机变量,0表示死了,1表示没死,它的分布根据其他楼的计算我们是知道的。
p( =0)=0.5
p( =1)=0.5
可以得知 的均值是0,5,方差也是0.5。
根据大数法则,重复实验n=10000000次之后。
死亡次数百分比 会服从正态分布,其均值为0.5,但是方差变成
此时我们进行一个假设检验,原假设H0为y=0.5
设置信度为5%,则y有95%的可能性落在一个以0.5为中心的区间
区间的上界可以根据下式算出来
1.96是标准正态分布0.025分位数。
下界只要把1.96换成-1.96。
最后算出来的区间是[0.49956 , 0.50044]。
所以说我们有95%的信心认为精灵龙的死亡百分比会处于以上区间。
如果把1.96换成2.58,那么我们就有99%的信心认为y会落在[0.49942,0.50058]之间。
而楼主算出来的结果是0.4993。
如果不是楼主遇到了小概率事件的话。
那么就可以有99%的信心认为原假设是错的,即y不等于0.5,
恭喜楼主,得到了1%水平上的统计显著。
当然更有可能的是,楼主程序写错了。
比如没有初始化随机seed。
果壳网友方弦与CyanoHao的回答
就是50%,除非有什么别的奇怪的分配方法。
做一次实验得到不足或者超过50%都是比较正常的,毕竟有随机性,不会正好是50%
楼主程序模拟的结果不同应该是 VC 随机库的问题。我用 GCC / Glibc 模拟的结果就更接近 50%,大于或小于 50% 都会出现。
|