但也因此这个方法往往被人诟病——技术含量低、结果不精确、计算效率低。
这个方法的原理很简单,以上述蛋刀套装的计算为例,使用2层循环,内循环使用一个Do while循环语句,在循环主体中使用一个变量对Boss击杀次数累加,并使用一个随机数模拟Boss的掉落结果。
在上述例题中,当蛋刀主/副手的掉落都为真时,则退出内循环,在外循环的For ..to..语句中,进行指定套数的蛋刀套装收集的模拟,用内循环的计数总和/指定的套装套数,得到平均一套蛋刀需要击杀的Boss次数。
基本逻辑伪代码主体部分如下:
pa=0.1
pb=0.5
raids=0
For set=1 to 1000000
seta=False
setb=False
Do while seta!=True and set!=True
‘循环体
‘模拟一次掉落
‘生成一个随机数
rd=Randbetween(1,100)
‘根据这个随机数,判断a/b本次的掉落情况
seta=Or(seta,rd>pa*100)
setb=Or(setb,rd>pa*100&&rd<(pa*100+pb*100))
raids=raids+1
…
loop
…
raids/1000000
…
vba很好学,24小时真的可以通关(满足工作需求绝无问题),多练习就可以。郑州游戏设计培训学校整理。
上述的方法无法使得每个人都满意,比如,当条件改变时——收集3把蛋刀主手和4个蛋刀副手,就需要修改循环主体,所以可以考虑将需要凑齐的部件作为函数的参数传入。
function raids(pa,pb,seta,setb)
…
end function
前面有说过,这个方法无法得到精确结果,但当模拟次数足够多时(如上文百万次),结果和精确结果非常近似。排除代码因素造成的人为Bug,这个方法非常可靠。所以有相当一部分数值策划直接用这个方法计算;或是用这个方法对概率公式的计算结果进行一次验算。
假如我们坚持要求出精确的期望次数,并且仍然希望解答方法足够简单,我们可以尝试函数递归。