一道简单的BUFF题
好久不见,这次又带来一道简单的数值题.因为上次被揍,emmm,这次就不皮了.
直接看题目
设定某角色攻速为0.7,即每0.7秒攻击一次.
此时,为该角色装备一个BUFF或者武器,效果为每次攻击有5%的几率触发效果1.
效果1:提升5%输出,持续10秒,最高叠加5次,每次叠加后刷新持续时间.
问题:该BUFF能提升角色多少伤害.
大家可以尝试自己解答一遍,得出一个答案后再来看解答过程。
由于本人比较傲娇,所以喜欢直接给出结果:8.8%。但是没关系,现在收手,不要向下滑动屏幕,你依然有机会得出答案的计算过程。因为答案是错的。
皮这一下我很开心。
解答:
(你看,我的解答总是来得如此突然,毫不修饰)
先不考虑断刀或其他情况.
BUFF持续10秒,攻速0.7,也就是,BUFF持续时间内有14次攻击机会.
这14次攻击机会触发BUFF的几率为
那么,我们可以得到每一层BUFF的触发几率和对应的伤害比例为:
BUFF层数 | 对应概率 | 对应伤害比例 |
0 | 0.027584 | 1 |
1 | 0.512325 | 1.05 |
2 | 0.249848 | 1.1 |
3 | 0.121845 | 1.15 |
4 | 0.059421 | 1.2 |
5 | 0.028978 | 1.25 |
这时候,我们将对应的概率和伤害比例之积求和,就得到结果1.088
即,BUFF能够提升8.8%的伤害.
一部分人倒在这里
但是…
我们只求得了每一层BUFF的触发概率,并没有考虑到每一层BUFF存在的平均伤害次数.
因为每一层BUFF最多可以砍出14刀,所以,我们只需要列出前14刀的概率和BUFF触发分布,如下
刀数N | 第N刀概率 | 前N刀概率 | 前14刀触发分布 |
1 | 0.05 | 0.05 | 0.097594 |
2 | 0.0475 | 0.0975 | 0.092715 |
3 | 0.045125 | 0.142625 | 0.088079 |
4 | 0.042869 | 0.185494 | 0.083675 |
5 | 0.040725 | 0.226219 | 0.079491 |
6 | 0.038689 | 0.264908 | 0.075517 |
7 | 0.036755 | 0.301663 | 0.071741 |
8 | 0.034917 | 0.33658 | 0.068154 |
9 | 0.033171 | 0.369751 | 0.064746 |
10 | 0.031512 | 0.401263 | 0.061509 |
11 | 0.029937 | 0.4312 | 0.058433 |
12 | 0.02844 | 0.45964 | 0.055512 |
13 | 0.027018 | 0.486658 | 0.052736 |
14 | 0.025667 | 0.512325 | 0.050099 |
我们对刀数N和前14刀的触发分布概率之积求和,得到触发BUFF的期望刀数6.674刀
从而得到每一层的平均刀数:
毫无疑义,0层为20刀,
1-4层为
5层为
(注意:这里用如果使用积分求出来的是近似值,想要精确些建议数列)
得出结果:
0 | 20 |
1 | 10.2465 |
2 | 10.2465 |
3 | 10.2465 |
4 | 10.2465 |
5 | 19.34354 |
但为了便于理解,我们不采取逐层求解的方式.
所以上面的结果并没有什么用.
你懂哒
我们将所有的战斗过程分为5种:
BUFF叠加到1层消失
BUFF叠加到2层消失
BUFF叠加到3层消失
BUFF叠加到4层消失
BUFF叠加到5层消失
每一种过程对应的平均攻击次数为该过程每一层的平均攻击次数之和
列表:
1 | 34 |
2 | 40.6736 |
3 | 47.34719 |
4 | 54.02079 |
5 | 66.03792 |
每一种过程对应的平均伤害为该过程造成的总伤害比上该过程的平均攻击次数
这里需要注意,以过程一为例,第20刀触发了BUFF,已经具有BUFF效果(当然,这是人为规定),也即,19刀无BUFF伤害和15刀BUFF一层效果的伤害
列表:
1 | 1.022059 |
2 | 1.045083 |
3 | 1.068664 |
4 | 1.092595 |
5 | 1.127543 |
每一种过程出现的概率为…简单的概率…
列表:
1 | 0.487675 |
2 | 0.249848 |
3 | 0.128003 |
4 | 0.065579 |
5 | 0.068894 |
所有过程的平均攻击次数为各过程平均攻击次数与出现概率的乘积之和
列表:
1 | 16.58095 |
2 | 10.16222 |
3 | 6.060603 |
4 | 3.542649 |
5 | 4.549626 |
40.89605 |
所以,我们计算得出最终的比例约为
Sum(各过程出现的平均攻击次数×该过程对应的平均伤害×该过程的平均攻击次数/所有过程的平均攻击次数)
列表:
1 | 0.414385 |
2 | 0.259692 |
3 | 0.158371 |
4 | 0.094647 |
5 | 0.125438 |
1.052532 |
即,该BUFF提升了角色约5.25%的伤害
这个计算过程并非最简的计算方式,但却是最好理解的计算方式,有兴趣的大佬可以考虑用更简便的方式计算.不过式子最终还是一样的啦.
当然,让我们脱离单纯的数学方法,我们也可以使用程序进行模拟.这里我选择了VBA
算了,太难写了,不写了.
先列下简单的数据
代码如下:
很简单的代码(别问我为什么没缩进,懒)
为了让数据更精确,我们取运行次数为10000000(取这么大绝对不是为了秀SSD,8Gddr4,和i5-7500,反正电脑是公司的...).
运行后,结果为:
得出比例大约在1.053左右
什么,10000000次太少了?
与我们计算得出的结论相近,而非1.088
至于这0.05%的误差来源,我认为是EXCEL保存数据精度的问题.
当然也可能是计算问题,代码或解题过程有误....因为自己解题习惯不好喜欢到处乱写...让我们假装没看见.
一部分...
咳咳,但是...我们一开始设立的前提是无限输出,没有追赶断刀技能等阻碍.
那这个怎么解决呢?
当然是直接给一个10秒内能触发的次数啊!
经过本题,我终于意识到了公式写得再好,也不如程序来得快.
利用以上方法,足够解决目前绝大多数游戏内的概率相关问题.
我是梦幻华策,就是文章上了GAD,有人给我点赞,也绝对不会皮了.
真好玩