阅读正文内容前请知晓: 本文由英文Warframe Wiki的用户FINNER在英文Wiki上发表的博客翻译而成,翻译文本仅供参考。在翻译时更改了部分表述以便于理解。正文中的“我”均指原作者。对于此页涉及内容的讨论,也可以在原博客参与讨论。

由于本文采用了较长的数学公式,在移动端显示可能会超出范围或者有其他不可预知的错误,为了获得更好的阅读体验,请在电脑端阅读此博客。


创建日期:2018年5月12日,圣殿猛兽:热修22.19.1

最后修订:2018年7月21日,版本23.1.1

  • 为模拟程序增加了github链接
    • 略微更新程序。
  • 修正了基本确保次数的计算方法。特别感谢wikia用户83.84.17.168帮助我找到正确的方法!程序和维基页面都已经相应更新。
  • 稍微调整以适应新的获取格式(表格,好耶!)


大家好,欢迎来到我这篇对于神秘的Warframe获取次数数据的讨论和解释!我注意到对于这些数字大家有一些问题以及总体来讲对此有疑问,所以我写了这篇博客,希望能够打消你们的数学上的顾虑。

我其实很早就该做这个了,但是说实话我就是有点忙而且总是忘事,即使有所提醒也是如此(略略略)。我对因此产生的不便道歉,但是我希望你能认真阅读并理解我这篇无中生有的解释!


定义

首先,在好戏开始之前我们应该定义一些关键的术语,以防止任何混乱以及纠正一些字面上的误解。

1、至少一次:这个应该很好理解,但是我想将获得每个部件至少一次的概念清楚而且准确地确定。我们拿Excalibur的页面举个例子:

掉落 几率 期望 基本确保
机体蓝图 38.72% 6 – 7 27 ± 9
头部神经光元蓝图 38.72%
系统蓝图 22.56%

这些数据想要表达的要点就是在完成任务总共6-7次后你应该期望可以获得至少一个头部神经光元、至少一个机体以及至少一个系统。这并不意味着每个部件都需要6-7次,也就是说收集全部三个部件的期望次数不是18-21次。


2、期望:这个数字表示整个玩家群体的平均数据。换句话说,从数据来看居中的玩家在进行次任务后会获得每个Warframe部件至少一次。


3. 基本确保:这个词语可能是最需要澄清的一个。这个数字表示玩家要想让自己已经获取每个部件至少一次的概率超过某个特定值需要完成任务的次数。请注意,这里使用并着重强调了“概率”这个词,而不是“掉落几率”。增加完成任务的次数并不会增加一个部件的掉落概率,而是增加你已经获得某个部件的概率。

对于此最简单的类比就是想想抛硬币的过程。抛一枚硬币,它分别有50%的几率正面向上以及反面向上,与掉落概率类似地,无论抛这枚硬币多少次,这个50%的几率都不会改变。但是,想想这个问题:如果我抛一枚硬币2次,它正面向上至少一次(即已经出现过正面向上)的概率是多少?每次抛硬币正面向上的概率还是50%,但是在这两次抛硬币中至少一次正面朝上的概率就不是50%,而是75%。

如果你抛3次那么至少一次正面向上的概率就上升为87.5%,抛四次则概率为93.75%。抛25次则概率为99.99999702%(这时我们可能会说基本确保至少有一次正面向上)。请记住,硬币本身并没有变,每次抛硬币正面向上的概率仍然是50%,但是已经出现过正面向上的概率却会随着抛的次数的增加而上升。

了解这些后,我们就可以理解“基本确保”的作用就是告诉你一个玩家要达到有99%-99.99%的概率已经获取每个部件至少一次所需要完成任务的次数。更具体来讲,在上面给出的Excalibur的例子中,要达到99%概率需要完成任务18次,要达到99.9%概率需要27次,而要达到99.99%概率则需要36次。


数学

好了,现在无聊的部分结束了,我们就可以来看看这些次数的实际数学原理和数据。这里我们考虑三种不同类型的Warframe。

第一种

第一种是所有部件均由一个来源掉落的Warframe,比如,所有的Excalibur部件均由火星WAR节点的Lech Kril中尉掉落。要计算我们的数据,我们就要先找出获得每一个部件的平均概率。

在以下例子中:
头部神经光元掉落几率 =
机体掉落几率 =
系统掉落几率 =

一开始你有0个Excalibur部件。
当你杀死Kril完成任务后,你获得一个你没有的Excalibur部件的概率为:

(AC指平均概率)


你现在有一个Excalibur部件,还需要两个。
你获得一个你没有的Excalibur部件的概率为:

(AC指平均概率)


你现在有两个个Excalibur部件,还需要一个。
你获得一个你没有的Excalibur部件的概率为:

(AC指平均概率)


现在我们有了平均概率的数据,我们就能用简单的数学计算期望完成任务的次数。

(Expected指期望次数)


要计算基本确保(Nearly Guaranteed, NG)次数我们就需要用到一点数值的方法了。计算完成次任务后获得每个部件“至少一次”的概率的公式为:

(DP指需求概率值)

但是这里我们想要知道的是,此方程成为了超越方程,我们无法通过重排解决它,这时我们就需要用到一些数值的方法来解这个方程。对我们来说使用二次反插值(IQI)方法完全足够了,所以我们就用这种方法解决这个方程。

如果你对IQI比较陌生的话说明一下,简单来说IQI就是一种寻找一个方程的解所在的x轴值的方法。比如,假设我们要解的方程要简单得多:

如果我们不想通过代数方法解出的话我们可以用IQI的方法寻找到此方程的解。首先,我们要把方程重排成一侧等于0的形式,像这样:

接下来我们要用到IQI功能来找到满足这个式子的值(在MatLab中这个功能叫做fzero())。

x = fzero( @(x) 2 * x - 4 , 0); %The ", 0);" 末尾的数字是程序寻找解时的起始值,其实它可以是任意值。

fzero()几乎一瞬间就会给出解2。

相似地,我们也会用这种方法找到前面的方程中的的解。

首先重排:

之后使用fzero找到的值:

x = fzero( @(x) 1 - DP - (1 - P1)^(x) - (1 - P2)^(x) - ... - (1 - PN)^(x) , 0);

我们重复三次,每次的需求概率值(DP)分别为99%、99.9%以及99.99%。对于上述的Excalibur的例子,计算式为:

x = fzero( @(x) 1 - 0.999 - 2*(1 - 0.3872)^(x) - (1 - 0.2256)^(x) , 0);
(NG指基本确保次数)


第二种

第二种就是每个部件由不同的地点掉落的Warframe,例如Harrow的机体从堕落的敌人掉落,他的头部神经光元从赤毒要塞的PAGO节点间谍任务获得,他的系统从叛逃任务中获得。因为这些部件不在同一个奖励池,所以我们无需担忧获得每一个部件的每一步的概率,这使得计算简单迅速。

在以下例子中:
头部神经光元掉落几率 = 11.28%
机体掉落几率 = 3.00%
1阶任务中系统掉落几率 = 7.52%
2、3阶任务中系统掉落几率 = 11.28%

(Neuroptics Expected指头部神经光元预期次数)
(Chassis Expected指机体预期次数)
(T1 Systems Expected指1阶任务系统预期次数)
(T2 and T3 Systems Expected指2、3阶任务系统预期次数)


要计算基本确保次数,我们使用和前面一样的公式,但是因为每个部件均由不同地点掉落,这个方程就不再是超越方程,也就是说可以用代数方法解:




(NG (Neuroptics)指头部神经光元基本确保次数)


第三种

最后这个第三种其实就只有Equinox。Equinox和第一种的Warframe一样从单一地点掉落,但是与其他Warframe不同,她需要的部件多达8个,而不是一般的3个。理想情况下我们可以用第一种的说明中的公式,再加5个式子算入其余5个部件的概率,但是我要解释一下为什么这么做会很不现实。

第一种Warframe用的式子有逐渐增多的项数。也就是说第一个式子只有一项([u]),第二个式子有3项([u + v + w]),而第三个式子有6项([u + v + w + x + y + z])。要更好地归纳出项数增加的规律,我们可以看看两个部件的式子:

  1. ([u]),1项
  2. ([u + v]),1项

而对于四个部件这个形式则会是:

  1. [u](1项)
  2. [u + v + w + x](4项)
  3. [u + v + w + x + y + z + u` + v` + w` + x` + y` + z`](12项)
  4. [u + v + w + x + y + z + u` + v` + w` + x` + y` + z` + u`` + v`` + w`` + x`` + y`` + z`` + u``` + v``` + w``` + x``` + y``` + z```](24项)

事实上,对于任何个数的部件()每个式子的项数的都可以用以下公式求得,这里是已经拥有的部件数:

或者

这意味着如果我想要列出Equinox所需要的8个式子,每个式子的项数会是:

  1. 1
  2. 8
  3. 56
  4. 336
  5. 1,680
  6. 6,720
  7. 20,160
  8. 40,320

所以如果我仅仅想要计算获取最后一个部件的平均概率的话,我的式子就会有40,320项……我不会这么做的。我们可以认为Equinox的每个部件的掉落几率是相近的(其中6个掉落几率为12.91%,其余两个为11.28%)。因为它们很接近所以我们就可以通过将它们的掉落概率都视为平均的,即1/8(12.5%)来估算每一步的平均概率,这样我们就可以用简单的逻辑得出平均概率:

一开始你有0个Equinox部件。
当你杀死Tyl Regor完成任务后,你获得一个你没有的Excalibur部件的概率为:

你现在有一个Equinox部件。
你获得一个你没有的Equinox部件的概率为:

你现在有两个Equinox部件。
你获得一个你没有的Equinox部件的概率为:

你现在有三个Equinox部件。
你获得一个你没有的Equinox部件的概率为:

你现在有四个Equinox部件。
你获得一个你没有的Equinox部件的概率为:

你现在有五个Equinox部件。
你获得一个你没有的Equinox部件的概率为:

你现在有六个Equinox部件。
你获得一个你没有的Equinox部件的概率为:

你现在有七个Equinox部件。
你获得一个你没有的Equinox部件的概率为:


现在我们得到了估算的平均概率值我们就可以像前面一样用基础的数学通过简单的计算算出期望次数。

(Expected指期望次数)


要计算基本确保次数可以利用第一种里面同样的方法:

x = fzero( @(x) 1 - 99.9% - 6*(1 - 12.91%)^(x) - 2*(1 - 11.28%)^(x) , 0);
(NG指基本确保次数)


正确性

我们有数字了,但是它们正确吗?我用其他人用过的一些方法和数字交叉检查了我的结果,我看了看Reddit和其他地方上声称我的数据是错误的或者这样或那样才正确的帖子,但是每次有人这么说的时候评论区总会有争论,也没有确定的结果。看起来不管我看哪里都没能够一致同意哪个方法是正确的方法。因此我亲自动手编写了一个模拟掉落的程序。

简单来讲,这个程序会计算收集齐所有的部件所需的“次数”,将这个数据存入一个数组,之后重复这个过程。每次程序重复这一过程都代表一个玩家刷到了所有的部件。现在我的程序设定为重复1,000,000次,每次都将集齐次数记录入数组以记录有多少玩家完成任务x次后刚好集齐所有部件。

比如,我将程序的样本容量设为5而不是1,000,000,并且在掉落概率处输入1/3、1/3、1/3,这个数组可能会看起来像这样:

次数 | 玩家数
1 | 0
2 | 0
3 | 2
4 | 0
5 | 2
6 | 1

这告诉我们在这五个玩家中,2个玩家仅3次就集齐了三个部件,2个玩家完成5次后集齐,而1个玩家完成6次后集齐。

在程序运行1,000,000次后它会将数组中的数据绘图并计算平均完成任务次数。当然,这个与我们前面计算的期望次数直接对应,这个结果将会告诉我们上述方法是否是正确的方向。

比如,回顾前面的Excalibur的例子以及我们计算的结果:

(Expected指期望次数)
(NG指基本确保次数)


通过模拟实验,我们绘出这样的图(点击放大):

UserFINNER-Plot2.png


对Equinox也可以依法炮制:

(Expected指期望次数)
(NG指基本确保次数)


UserFINNER-EquinoxPlot.png
这个是利用的实际的12.91%~11.28%数值,而不是估算的1/8。


请注意这是1,000,000样本的结果,如果想要更加准确我们需要进一步增加样本容量至比如10,000,000甚至100,000,000。但是老实说我的电脑运行1,000,000次就够受的了,所以我选择使用这个数字或更少。

尽管如此,我认为这些统计图已经对我的方法提供了可以接受的证实。

模拟程序的代码可以在下面以.m格式找到。如果你没有MatLab的话你还可以尝试下载一个转换器将代码转换成你想要的语言,但是我不能保证前述转换器的可靠性或准确性。

https://github.com/FINNSTAR7?tab=repositories

谢谢!

avatar
Lysinelai
……
5.0
4人评价
avatar
F
0
欸,这个正确性是不是Confidence interval啊

2个月
F
0

请问harrow的那个例子中,头计算出来是58次,那么后面的±20是怎么得来的呢

6个月
F
0

哦,似乎知道了,应该是99%到99.99%之间的

6个月
3
0
龟龟···一句话使劲刷 都会有··

6个月
D
Div2009
0

这才是真正的大佬

6个月
S
0
更具体来讲,在上面给出的Excalibur的例子中,要达到99.9%概率需要完成任务27次,要达到99.9%概率需要18次,而要达到99.99%概率则需要36次。

要改吗?
7个月
avatar
Lysinelai
0

已更正

7个月
Y
0

膜拜数学大佬

7个月