Unlimited Dizziness Works

Aster GameのDay, 理宅异闻录 Leave a Comment

大多数游戏中技能的冷却时间都要比生效时间长得多,如眩晕这样的强力技能当然更是如此.不过在一些IMBA的游戏中眩晕冷却比眩晕时间还短也是很正常的.我还记得上中学的时候玩神墓的魔兽地图,开了Whosyourdaddy然后被地图左边一堆忘了叫什么的石头人无限晕按死在那里,挣扎了两分钟选择自杀...

我们来研究下这种有趣的情景,先研究回合制时的情况,因为即时值对砍的话也能等效成回合制.


设技能持续回合数为$s$,比如说$s = 2$,那就是我先手发动,敌人第一第二回合就晕;敌方先手,我后手发动那就第二第三回合晕,以下讨论都假设我方先手.

说到哪了来着...接下来设$p$为发动概率,这个当然用的是圆桌斥化后的真实概率.

如果技能效果不刷新,那就太容易了,直接判定能不能接上就行了.判定次数与回合数的关系直接下取整就行了.

即$\displaystyle{P_n = {p^{^{\left\lfloor {\frac{n}{s}} \right\rfloor }}}}$

如果技能效果刷新...动态规划咯,列出所有合法情况...因为有更好的办法我就不费脑子写DP了,直接写了个穷举,代码在这一段末尾.

用一串长度为$n$的{0,1}串代表这个过程,假设1是触发,0是不触发,那么0不能连续出现$s$次.

如果看过《组合数学》的话就会知道长度为$n$的所有$2^n$个{0,1}串中,最长连续0串长度小于$s$的合法序列数量是个$n$阶斐波那契.

$n$阶斐波那契自己都没有封闭形式,最后的结果我想大概也写不出封闭形式.

没啥必要去纠结解析形式,下面要说的方法超好理解,算法复杂度也不高.

我们以$s = 3$为例,把这个过程分类为几种状态,$n = 0$效果发动,那就是还将持续二回合的状态,$n = 1$判定成功就有几率回到还将持续二回合的状态,判定失败的话就进入还将持续一回合的状态,然后下一回合进行最终判定,判定失败的话就不用继续下去了,把这条转移链扔到不合法分类里...

然后先让我喘口气,感觉我在玩游戏王......写成马尔可夫矩阵就是这个样子:

$n=0$$n=1$$n=2$
还将持续两回合1$\color{Red}{p}$$\color{Red}{p^2}$
还将持续一回合0$\color{Blue}{1-p}$${\color{Red}{p(1-p)}}+\color{Blue}{p(1-p)}$
状态终止00$\color{Blue}{(1-p)^2}$

$n = 0$初始时的状态向量是已知的,100%还能维持两回合,也就是$s_0 = (1,0,0,0)$

然后就是喜闻乐见的快速矩阵运算,然后用1减去所有失败的概率就是成功延续$n$回合的概率了.

$$P_n = 1 - {s_n}[4] = 1 - {M^n}{s_0}[4]$$

最终结果莫名其妙的和$\displaystyle{\frac{k}{1 + e^{ax + b}}}$或者$\displaystyle{\frac{1}{e^{ax + b}}}$拟合的很好.

唔...拟合优度高的惊人,去掉前几个bug点的话几乎就是了,有点意思...

以上所有讨论的代码如下:


你问即时制怎么换算?

这还不简单,设攻速为$s$,攻速定义每秒$s$次,持续时间为$t$,直接令$s \to \left\lfloor {st} \right\rfloor $就行了

我们来算算,按照每秒3次每次持续时间2秒算好了,命中眩晕概率是$40%$,用第二个模型算出来被连晕120秒的概率只有$8.3%$...这概率似乎...怎么也算不上高啊...

我想想啊...其实如果这个过程突然中断了几次我也感觉不出来,比如说中断一次就0.33秒,那我大概是感觉不出来的.

所以接下来我们需要计算的是给定时间$n$回合,被晕回合数的期望.

同样先算不覆盖的情况,然后同样先用不咋滴好用的递推解法.

当$n \leqslant s$时,覆盖结果取决于第一次触发时的回合数,当第$k$个回合触发时,覆盖回合数就是$n - k + 1$,该事件发生的概率就是$p{\left( {1 - p} \right)^{k - 1}}$

所以覆盖期望就是:

$${a_n} = \sum\limits_{k = 1}^n {\left( {n - k + 1} \right)p{{\left( {1 - p} \right)}^{k - 1}}}  = n + 1 - \frac{{1 - {{\left( {1 - p} \right)}^{n + 1}}}}{p}$$

当$n > s$时,以第一回合时候触发分类

若第一回合触发,则$n$个回合中总的覆盖数为$s + {a_{n - s}}$

若第一回合不触发,则$n$个回合中总的覆盖数为${a_{n - 1}}$

合起来就是$a_n = p\left( {s + {a_{n - s}}} \right) + \left( {1 - p} \right){a_{n - 1}}$,该递推式的初值由上面的那个表达式决定.

我们来求个值,$s=8,p=0.6$时,这个模型蛮有趣的:

 

值列表近似一条直线,有着微小波动的直线,这个波动是由高阶线性差分引起的,周期正好是$4s$.这不是重点,重点是斜率是多少.

我代了几个值猜测$\displaystyle{E_n\sim \frac{{nps}}{{p(s - 1) + 1}}}$

这应该是能用线性差分定性理论算出来的,分析过程会很烦,我懒得推了,证明这种事就交给读者你啦...

这递推逻辑真心绕...不覆盖都这么绕覆盖当然更加绕了...我还是回去请出马尔科夫矩阵吧.....

很容易写出以下过程,比如$s = 5$时就是:

不覆盖矩阵就是

\[\left( {\begin{array}{*{20}{c}}
0&1&0&0&0&0 \\
0&0&1&0&0&0 \\
0&0&0&1&0&0 \\
0&0&0&0&1&0 \\
p&0&0&0&0&{1 - p} \\
p&0&0&0&0&{1 - p}
\end{array}} \right)\]

覆盖的话矩阵就是

\[\left( {\begin{array}{*{20}{c}}
p&{1 - p}&0&0&0&0 \\
p&0&{1 - p}&0&0&0 \\
p&0&0&{1 - p}&0&0 \\
p&0&0&0&{1 - p}&0 \\
p&0&0&0&0&{1 - p} \\
p&0&0&0&0&{1 - p}
\end{array}} \right)\]

附上以上推导的数值验证:

代码写着都舒服...这次算的是有效时的期望,所以总回合数减去最后一列每次失败的期望之和就行了.

技能效果覆盖的那个矩阵第一行都一样,所以\(s\)回合后就收敛不再变化了,这显然是能写出表达式的.

所以最终结果就是

  • 技能不覆盖期望为$\displaystyle {E_n \approx \frac{{nps}}{{p(s - 1) + 1}}}$
  • 技能覆盖期望为$\displaystyle {E_n = 1 + n + \frac{{{{\left( {1 - p} \right)}^s}\left( {1 + p\left( {s - n - 1} \right)} \right) - 1}}{p}}$

用这个模型的话可以发现120s中有113秒是被晕着的,平均一秒被晕0.943秒,平均意义上确实感觉不出来.


最后写个蒙塔卡罗大法来验证以上推导...

发表评论