一个概率问题,在炉石传说中,对方英雄满血且对面场上有一个2血精灵龙,我用出一发奥术飞弹,打死精灵龙的概率是多少?听说答案是50%。我觉得这题不简单,编程得到的结果匪夷所思,接近49.93%但是不到50%。奥蛋每次攻击都是独立判定的,但是对于这个特定模型来说,只有一种情况下,概率会有不同。那就是当前两次伤害已经打死精灵龙,最后一次就只能打脸了。用文字表示的话,打脸是0,精灵龙是1。
前面6种都是12.5%的概率出现,最后一种则是25%,那么统计一下出现两次1的情况,就是D、F和G,其中D和F都是12.5%的概率,G是25%,加起来一共50%。如果你采用多次迭代的方法进行统计,那么实际得到的结果跟理论计算确实会有一定的差距。不妨试试把实验次数提高一些。
用Excel算了一下概率:2血,1血,0血,第1发,50.0%,50.0%,0.0%;第2发,25.0%,50.0%,25.0%;第3发,12.5%,37.5%,50.0%。这东西好像叫马尔科夫链。每行规则是:2血概率=上回合2血概率*50%;1血概率=上回合2血概率*50%+上回合1血概率*50%;0血概率=上回合1血概率*50%+上回合0血概率。
就这样迭代下去,所以N发打死精灵龙的概率也可以算。楼主是试过很多次都是这样吗?只学过VBS,代码如下:k=0,minion=2,hero=30,for i=0 to 99999,fire(),fire(),fire(),if minion=0 then k=k+1,minion=2,hero=30,next,msgbox "在100000次试验中,精灵龙死了"&k&"次"。
function fire(),if minion>0 then,Randomize,if rnd>0.5 then,minion=minion-1,else,hero=hero-1,end if,else,hero=hero-1,end if,end function。试验了100000次,看上去差不多50%。