明日方舟抽卡模型#
GGanalysis 使用基本的抽卡模板模型结合 明日方舟抽卡系统参数 定义了一系列可以直接取用的抽卡模型。需要注意的是明日方舟的抽卡系统模型的确定程度并没有很高,使用时需要注意。
此外,还针对性编写了如下模板模型:
参数意义#
item_num
需求道具个数,由于 sphinx autodoc 的 bug 在下面没有显示
multi_dist
是否以列表返回获取 1-item_num 个道具的所有分布列,默认为False
item_pity
道具保底状态,通俗的叫法为水位、垫抽,默认为0
type_pity
定向选调的类型保底状态,默认为0,即该机制尚未开始触发;若为其它数,如20,那么就意味着定向选调机制已经垫了20抽,还有130抽就位于该保底机制的触发范围了(算上偏移量,实际为131抽)
calc_pull
采用伯努利模型时最高计算的抽数,高于此不计算(仅五星采用伯努利模型)
六星模型#
获取任意六星干员
- gacha_model.common_6star(multi_dist: bool = False, item_pity=0) FiniteDist | list #
带保底抽卡类
import GGanalysis.games.arknights as AK
dist = AK.common_6star(item_num=1)
print('抽到六星的期望抽数为:{}'.format(dist.exp)) # 34.59455493520977
无定向选调获取标准寻访-单UP六星干员
- gacha_model.single_up_6star_old(multi_dist: bool = False, item_pity=0) FiniteDist | list #
保底伯努利抽卡类
有定向选调获取标准寻访-单UP六星干员
- gacha_model.single_up_6star(multi_dist: bool = False, item_pity=0, type_pity=0) FiniteDist | list #
针对描述的寻访规则调整中提到的 定向选调机制 (在这里称为类型保底)
type_pity_gap
类型保底触发间隔抽数item_types
道具类别个数,可以简单理解为UP了几个干员up_rate
道具所占比例type_pull_shift
保底类型偏移量,默认为0(无偏移)
import GGanalysis.games.arknights as AK
dist = AK.single_up_6star(item_num=1, item_pity=0, type_pity=0)
print('4.6寻访机制更新后,无水位时抽到单up六星的期望抽数为:{}'.format(dist.exp))
4.6寻访机制更新后,无水位时抽到单up六星的期望抽数为:66.16056206529494
无类型硬保底轮换池获取特定六星干员
- gacha_model.dual_up_specific_6star_old(multi_dist: bool = False, item_pity=0) FiniteDist | list #
保底伯努利抽卡类
有类型硬保底时轮换池获取特定六星干员
- gacha_model.dual_up_specific_6star(multi_dist: bool = False, item_pity=0, type_pity=0) FiniteDist | list #
针对通过统计发现的类型保底
该机制目前仅发现存在于标准寻访-双UP轮换池(不包含中坚寻访-双UP轮换池),尚未知该机制的累计次数是否会跨卡池继承, 详细信息参看一个资深的烧饼-视频
import GGanalysis.games.arknights as AK
dist = AK.dual_up_specific_6star(item_num=1)
print('准备100抽,从轮换池捞出玛恩纳的概率只有:{}%'.format(sum(dist[:100+1]) * 100))
准备100抽,从轮换池捞出玛恩纳的概率只有:49.60442859476116%
双UP限定池获取特定六星干员
- gacha_model.limited_up_6star(multi_dist: bool = False, item_pity=0) FiniteDist | list #
保底伯努利抽卡类
需要注意的是,此模型返回的结果是不考虑井的分布。如需考虑井需要自行进行一定后处理。
import GGanalysis.games.arknights as AK
dist = AK.limited_up_6star(item_num=5)
print('一井满潜限定的概率:{}%'.format(sum(dist_4[:300+1]) * 100))
一井满潜限定的概率:14.881994954229667%
双UP限定池集齐两种UP六星干员
- gacha_model.limited_both_up_6star(item_pity=0, *args: any, **kwds: any) FiniteDist | list #
方舟限定池同时获取限定6星及陪跑6星模型
total_item_types
道具的总类别数collect_item
收集道具的目标类别数
import GGanalysis.games.arknights as AK
dist = AK.limited_both_up_6star()
print('全六党吃井概率:{}%'.format((1-sum(dist[:300+1])) * 100))
全六党吃井概率:7.130522684168872%
五星模型#
注意
明日方舟五星干员实际上有概率递增的星级保底机制,但其保底进度会被六星重置。这里对五星模型采用了近似,认为其是一个概率为考虑了概率递增的伯努利模型。另外,此处提供的五星模型也没有考虑类型保底。
此外明日方舟五星模型没有采用 BernoulliLayer
构建模型,而是直接采用了 BernoulliGachaModel
,当设置 calc_pull
太低时,返回的分布概率和可能距离 1 有相当大差距,需要适当设高。
获取任意五星干员
- gacha_model.common_5star(calc_pull: int = None) FiniteDist #
伯努利抽卡类
获取单UP五星干员
- gacha_model.single_up_specific_5star(calc_pull: int = None) FiniteDist #
伯努利抽卡类
获取双UP中特定五星干员
- gacha_model.dual_up_specific_5star(calc_pull: int = None) FiniteDist #
伯努利抽卡类
获取三UP中特定五星干员
- gacha_model.triple_up_specific_5star(calc_pull: int = None) FiniteDist #
伯努利抽卡类
自定义抽卡模型例子#
注意
AKDirectionalModel
可以为某个 FiniteDist
类型的,无保底类型的分布载入定向选调机制。
AKHardPityModel
可以为某个 FiniteDist
类型的,无保底类型的分布载入类型硬保底机制。
AK_Limit_Model
未加入新增的定向选调机制,其使用的 CouponCollectorLayer 不考虑集齐多套的需求。这个模型接下来可能重写,如果想要在其他地方引用的话可以先临时复制代码出来本地使用,或是将 AK_Limit_Model 加入__all__公开列表进行调用。
联合行动池集齐三种UP六星干员
import GGanalysis.games.arknights as AK
triple_up_specific_6star = AK.AK_Limit_Model(AK.PITY_6STAR, 1, total_item_types=3, collect_item=3)
dist = triple_up_specific_6star(item_pity=5) # (默认)期望集齐一轮,此前垫了5抽
print('期望抽数为:{}'.format(dist.exp)) # 期望抽数为:188.63258247595024
print('方差为:{}'.format(dist.var)) # 方差为:10416.175324956945
print('100抽以内达成目标的概率为:{}%'.format(sum(dist[:100+1]) * 100)) # 100抽以内达成目标的概率为:16.390307170816875%
定向寻访池获取特定六星干员
import GGanalysis as gg
import GGanalysis.games.arknights as AK
# 六星100%概率,UP三个,故抽到目标UP六星的概率为1/3
triple_up_specific_6star = gg.PityBernoulliModel(AK.PITY_6STAR, 1 / 3) # 尚未证实定向寻访是否存在类型硬保底机制,仅使用保底伯努利模型
dist = triple_up_specific_6star(2) # 在定向寻访池期望抽到目标六星干员两次,此前没有垫抽
print('期望抽数为:{}'.format(dist.exp)) # 期望抽数为:207.56732961125866
双UP限定池获取特定权值提升的非UP六星干员
非UP六星干员在六星中占比采用下式计算
\[p = 0.3\frac{5}{5 * \text{secondary up number} + \text{others number}}\]其中
secondary up number
为权值提升的非UP六星干员数量,others number
为除了主要UP干员和权值提升的非UP六星干员,其他准许获取的六星干员的数量。
import GGanalysis as gg
others = 71 # 假设除了主要UP干员和权值提升的非UP六星干员外,其他准许获取的六星干员的数量为71
triple_second_up_specific_6star = gg.PityBernoulliModel(AK.PITY_6STAR, 0.3 / (5 * 3 + others) * 5) # 在当前卡池内,权值提升的非UP六星干员数量一般为3
success_count = 3 # 期望抽到某个权值提升的非UP六星干员三次
dist = triple_second_up_specific_6star(success_count, True) # `multi_dist` 为True表示以列表形式返回分布
for i in range(1, success_count + 1):
print(f"抽到第{i}个目标干员~期望抽数:{round(dist[i].exp, 2)},方差:{round(dist[i].var, 2)}") # 结果保留两位小数
# 抽到第1个目标干员~期望抽数:1983.42,方差:3890458.19
# 抽到第2个目标干员~期望抽数:3966.84,方差:7780916.38
# 抽到第3个目标干员~期望抽数:5950.26,方差:11671374.57
# 不太建议计算非主要UP的干员的数据,分布会很长
标准寻访-单UP池中集齐两种UP五星干员
import GGanalysis.games.arknights as AK
both_up_5star = AK.AK_Limit_Model(AK.PITY_5STAR, 0.5, total_item_types=2, collect_item=2)
dist = both_up_5star() # 期望在轮换单UP池中抽到两个UP的五星干员,此前没有垫抽
print('期望抽数为:{}'.format(dist.exp)) # 期望抽数为:63.03402819816313
自定义带有类型硬保底的模型
# 添加定向选调前已知存在类型硬保底的卡池为标准寻访中的单UP和双UP池,其它卡池暂无证据表明存在此机制,此处仅为演示如何定义此类模型,不能当做机制参考
import GGanalysis as gg
import GGanalysis.games.arknights as AK
# 假设定向寻访池存在类型硬保底机制
# 六星100%概率,UP三个,故抽到目标UP六星的概率为1/3
triple_up_specific_6star_without_hard_pity = gg.PityBernoulliModel(AK.PITY_6STAR, 1 / 3) # 没有硬保底
triple_up_specific_6star_has_hard_pity = AK.AKHardPityModel(triple_up_specific_6star_without_hard_pity(1), AK.p2dist(AK.PITY_6STAR), type_pity_gap=200, item_types=3, up_rate=1, type_pull_shift=1) # 载入硬保底
dist = triple_up_specific_6star_has_hard_pity(2) # 在定向寻访池期望抽到目标六星干员两次,此前没有垫抽
print('期望抽数为:{}'.format(dist.exp)) # 期望抽数为:207.0218117279958