如何评价《明日方舟》限定池300抽保底?

0 前言

(不想看过程的直接拉到分割线后面看结论吧~~~)

过两天就要开【月隐晦明】的限定池了,抽卡群的群友们个个摩拳擦掌,迫不及待地想在新限定池战个天昏地黑。突然,有群友发问:“限定池双UP毕业的期望是多少抽!?”真是个刺激的问题,鉴于上次已经回答了个关于标准寻访的六星期望问题,这次决定再来讨论一下限定池的情况。

1 引言

关于双UP毕业的期望是多少抽,其实在nga已经有人讨论过啦,这里贴一个链接:

[分享氵]关于明日方舟up角色抽卡的概率和期望一览表

以及里面的结论:

首先要指出,图中双六星毕业的期望148.27是没有考虑井的情况,300抽的保底肯定是对这个期望有正面影响的。其次,为了紧扣主题,本回答将解决以下问题:

  • 300抽保底机制下不同抽卡次数对应限定池双UP的毕业概率是多少?
  • 同样机制下,限定池双UP毕业的期望是多少抽?
  • 300抽保底机制(井)为玩家带来了多少好处?

2 方法与实现

其实最简单的方法就是蒙特卡洛暴力算,不过如果仿真次数不多的话容易出现估计有偏的情况,并且每次程序运行的结果可能会有所不同。所以这次我们采用一个比较稳的方法——递推法。

具体思路如下:

在限定池抽卡,玩家的状态可以用三个数 [a,b,c] 表征,其中 a 为总抽卡次数, b 为六星保底状态(垫刀)次数, c 为已获得六星的个数。很显然,由于没法垫刀,最开始大家的状态都是 [0,0,0]

状态之间的递推如下:

[a,b,c]\rightarrow \begin{cases} [a+1,b+1,c], 未抽到六星\\ [a+1,0,c+1], 抽到六星\end{cases}

其中抽到六星的概率为 p(b) ,在 b\le50 时为0.02,其他时候会递增到1,未抽到六星的概率为 1-p(b)

另外,这个递推并非无穷递推,很显然,到了600抽吃了两次井之后,鬼都能双UP毕业了,所以 a 达到600的时候就结束了。

到这里思路就已经阐述清楚了,后面就是贴代码的时候,这里又用上了工科生最爱的MATLAB,请忽略我无穷无尽的for loop,由于MATLAB里头开数组没法从0开始,所以为了方便在代码里对 [a,b,c] 的定义做了简单的调整。

a_max = 601; b_max = 100; c_max = 601;
prob = zeros(a_max, b_max, c_max);
prob(1,1,1) = 1;
p_i = 0.02 * ones(99,1);
for b = 51:99
    p_i(b) = 0.02+(b-50)*0.02;
end

for a = 1:600
    fprintf('a=%g\n',a)
    for b = 1:99
        for c = 1:600
            prob(a+1,b+1,c) = prob(a+1,b+1,c) + (1-p_i(b)) * prob(a,b,c) ;
            %没抽到六星
            prob(a+1,1,c+1) = prob(a+1,1,c+1) + p_i(b) * prob(a,b,c) ;
            %抽到了六星
        end
    end
end

这个prob矩阵包含的信息为:在抽了 a 次之后,获得 c 个六星且垫刀 b 次的概率。

随后,运用一些概率论的知识,可以对prob矩阵进行转换,得到一些有用的信息:

prob_double = zeros(601,1); 
prob_single = zeros(601,1);
for i = 1:601
    prob_double(i) = 1-0.65^(i-1)*2+0.3^(i-1); % 抽到双UP的概率
end
for i = 1:601
    prob_single(i) = 1-0.3^(i-1); % 抽到单UP的概率
end

final = zeros(600,1);
final(1) = 0; % 第一抽是不可能毕业的
for i = 3:300
    temp = reshape(prob(i,:,:),100,[]); % 前299抽必须靠自己抽才能毕业
    final(i-1) = sum(temp) * prob_double;
end
for i = 301:600
    temp = reshape(prob(i,:,:),100,[]); % 由于有井,第300~599抽只要有单UP就能毕业
    final(i-1) = sum(temp) * prob_single;
end
final(600) = 1; % 第600抽,鬼都能毕业
d_final = final(2:600) - final(1:599);
E = (2:600) * d_final;

注意到这里我引入了两个辅助向量,分别是:

  • prob_double :抽到i+1个六星时拥有双UP的概率;
  • prob_single : 抽到i+1个六星时拥有单UP的概率。

这个d_final是毕业时抽卡次数的概率密度函数,画出来大概长这个样子(可见井的截断效应还是很明显的):

而这个E就是期望了,E=142.0785。

3 对比

没有300井是个什么情况?不考虑井的话就不需要递推这么麻烦了,直接对prob_double这个向量进行处理,得到毕业时抽到六星次数的概率密度函数pdf,再乘以六星的抽卡期望次数即34.5949就行了,代码如下:

% 看看没有300井的情况
d_final2 = prob_double(2:601) - prob_double(1:600) ;
E2 = 34.5949 * (1:600) * d_final2;

最后E2=148.2638,与一开始nga图里头的期望是一致的。


4 结论

一、300抽保底机制下,双UP毕业的期望抽卡次数约为142次。

二、300抽保底机制的引入对追求当期毕业的玩家来说,从期望角度约减少了6次抽卡,折合3600合成玉,20源石。

三、即使在300抽保底机制下,脸黑的人也有可能会抽到599下都没能毕业,这种情况的概率是3.3617e-08,大约一亿个人里有三个多。

四、如果说抽卡的前方是无尽的黑暗,那就让井帮我们染尽黑暗吧。(我是不是串戏了?)

五、祝看这个回答并点赞的博士们一发十连毕业限定池。

来源:知乎 www.zhihu.com

作者:郑文强

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载

此问题还有 157 个回答,查看全部。
延伸阅读:
为什么明日方舟有些玩家会不希望游戏出现累充机制呢?

明日方舟可以用什么机制刺激玩家推图?