两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 |
技术:出怪机制 [2024/10/24 21:58] – [选取某次出怪的行] 用latex重写公式 寒风 | 技术:出怪机制 [2025/02/22 19:23] (当前版本) – [选取出怪行的流程] 111.16.87.152 |
---|
\end{aligned}\end{cases}$$ | \end{aligned}\end{cases}$$ |
| |
{{:技术:pasted:20221220-031740.png}} | 我们可以很轻易地得出,$SmoothWeight_i$的值在$Weight_i$不趋近于0的条件下,被限制在区间$[0.01,100]$内。 |
| |
{{:技术:pasted:20221220-031938.png}} | 通过分析代码得知,游戏先生成一个$\left[0,\sum_{j=1}^{6}SmoothWeight_j\right)$范围内的随机数$RandNum$,然后令结果为第$i$行($i$为第一个使$\sum_{j=1}^{i}SmoothWeight_j\ge RandNum$的数,且当$\sum_{j=1}^{5}SmoothWeight_j<RandNum$时为6)。 |
| |
| 由于$RandNum=0$(这导致抽到第一行的概率稍大)的概率趋近于0,再忽略$RandNum$无法取到$\sum_{j=1}^{6}SmoothWeight_j$(这有时会导致抽到第六行的概率稍小)造成的微小误差,我们可以得出,对于第$i$行,抽取到该行的概率$P_i$为: |
| |
$$P_i=\begin{cases}\begin{aligned} | $$P_i=\begin{cases}\begin{aligned} |
* 将钉耙标记为已绑定,插入钉耙行,返回钉耙行行直接结束出怪计算 | * 将钉耙标记为已绑定,插入钉耙行,返回钉耙行行直接结束出怪计算 |
| |
先依次计算每行的权重,对于第i行,流程如下: | 先依次计算每行的权重,对于第$i$行,流程如下: |
| |
{{:技术:pasted:20221220-032900.png}} | |
| |
| - 若该行对于该僵尸类型不合法,令$Weight_i=0$并结束本行运算; |
| - 若为保护传送门关卡则进行以下计算: |
| - 若本行有传送门且传送门目标传送门距离小推车最近距离小于5(若没有小推车,则判断是否小于10),令$Weight_i=0.01$并结束本行运算; |
| - 若本行有传送门且不满足上述距离关系,令$Weight_i=1$并结束本行运算; |
| - 若本行无传送门,令$Weight_i=0.2$并结束本行运算。 |
| - 若为隐形食脑者关卡,当前波数小于等于3且$i=6$,令$Weight_i=0$并结束本行运算; |
| - 若本关不为无限波数关卡(包含老虎机,宝石迷阵,看星星,宝石迷阵转转看,坚果保龄球艺术锦标赛,种太阳花的艺术,松鼠),且当本次出怪为最后一波时,令$Weight_i=1$并结束本行运算; |
| - 定义整数$MowerTest$ = 当前波数 - 第$i$行上次丢车的波数; |
| - 若$MowerTest \le 1$,则令$Weight_i=0.01$并结束本行运算; |
| - 若$1<MowerTest \le 2$,则令$Weight_i=0.50$并结束本行运算; |
| - 若上述条件均不满足,令$Weight_i=1$并结束本行运算。 |
所有行计算完毕后,按抽取行原则选取行,然后插入行并返回结果行。 | 所有行计算完毕后,按抽取行原则选取行,然后插入行并返回结果行。 |
| |
==== 实验数据 ==== | ==== 实验数据 ==== |
| |
{{:技术:pasted:20221220-032909.png}} | 游戏的一次实验可以证明该理论的准确性。 |
| |
| 我们固定每次的''LastPicked''与''SecondPicked'',然后抽取一亿次出怪行,统计并分析数据可得: |
| |
| ^ 行数 ^ 权重 ^ LastPicked ^ SecondPicked ^ 平滑权重 ^ 概率 ^ 理论个数 ^ 实际个数 ^ 误差率 ^ |
| | 1 | 1 | 0 | 0 | 0.0029 | 0.009 | 972095 | 972657 | +0.058% | |
| | 2 | 1 | 2 | 0 | 0.1168 | 0.386 | 38597896 | 38597762 | +0.000% | |
| | 3 | 1 | 2 | 3 | 0.1817 | 0.600 | 60041171 | 60042656 | +0.002% | |
| | 4 | 0.2 | 2 | 3 | 0.0006 | 0.002 | 194419 | 193522 | -0.461% | |
| | 5 | 0 | 2 | 3 | 0.0000 | 0.000 | 0 | 0 | +0.000% | |
| | 6 | 0.2 | 2 | 3 | 0.0006 | 0.002 | 194419 | 193403 | -0.523% | |
| |
| 可以发现误差足够小,则我们可以认为该理论可以准确预测僵尸出怪情况。 |
| |
==== 一些推论 ==== | ==== 一些推论 ==== |
| |
推论1:僵尸没有可出行时出现在第六行 | **推论1:僵尸没有可出行时出现在第六行** |
| |
| 首先,当僵尸没有可选出怪行时,所有行的权重均赋值为0,故在抽取行时,所有行的平均权重均为0,按概率计算公式,有$P_6=1-\sum_{j=1}^{5}P_j$ |
| |
| 所有行的权重为0,则有$P_1=P_2=P_3=P_4=P_5=0$ |
| |
| 易得$P_6=1$ |
| |
| 所以此时该僵尸一定会在6路出现。 |
| |
| **推论2:在样本量足够大的情况下,平均概率仅与权重有关** |
| |
| 在一次实验中,对于一亿次出怪,我们获得了这样一组数据: |
| |
{{:技术:pasted:20221220-032938.png}} | ^ 行 ^ 权重 ^ WeightP ^ 个数 ^ 频率 ^ |
| | 1 | 1.0 | 0.294 | 29549753 | 0.295 | |
| | 2 | 1.0 | 0.294 | 29548796 | 0.295 | |
| | 3 | 1.0 | 0.294 | 29550658 | 0.296 | |
| | 4 | 0.2 | 0.059 | 5675859 | 0.057 | |
| | 5 | 0.0 | 0.000 | 0 | 0.000 | |
| | 6 | 0.2 | 0.059 | 5674934 | 0.057 | |
| |
推论2:在样本量足够大的情况下,平均概率仅与权重有关 | 以频率估计概率,可以认为平均概率为''WeightP''。 |
| |
{{:技术:pasted:20221220-032945.png}} | 因此,在作全局分析时,可以忽略''LastPicked''与''SecondPicked''带来的影响。 |
| |
推论3:在样本量足够大的情况下,''LastPicked<fs x-small>i</fs>''和''SecondLastPicked<fs x-small>i</fs>''仅与行被选中的顺序有关 | **推论3:在样本量足够大的情况下,''LastPicked<fs x-small>i</fs>''和''SecondLastPicked<fs x-small>i</fs>''仅与行被选中的顺序有关** |
| |
推论2被验证后,推论3是显然的。 | 推论2被验证后,推论3是显然的。 |