总是看到有人在讨论圣遗物什么情况下算是毕业,什么情况下算是大毕业。虽然在nga已经有了一个相对合理的标准(重新定义平民圣遗物!从300泥潭经典玩家看平民和毕业圣遗物的定义),即以刷取的树脂数量来定义对副词条的期望,但是对于不同的套装,其实刷取差异会非常大(以作者手头的雷神和心海来说,吃攻充双爆的雷神获取副词条,比只要生命充能的心海来说肯定要高得多),尤其是对于一些本身有效词条较少,还会被主词条占据的角色来说。因此,定义一种对所有角色都有参考标准的词条数期望计算工具,能够有效衡量不同角色之间毕业程度的差异,以及某个特定角色的副词条实际需要刷取多久。
考虑到对于其中大量的组合数,计算理论值实际是一件不那么容易的事,本项目通过对抽取圣遗物过程进行模拟,来得到不同角色圣遗物的副词条期望。特别的,考虑到直接抽样对抽样精度和时间效率的影响较大,本文通过拆分成不同的概率分布进行多级抽样的方式,在有限的抽样计算资源内完成:某个角色的四件套圣遗物,刷取T个之后,期望的整套词条是多高。
首先对于不同的角色,设定不同的有效主词条与副词条。
-
主词条表示可以使用这种部位,但是不必要一定是这种(例如攻击杯、雷伤杯同时出现,意味着二者任选其一都可以满足要求)。
-
副词条表示对这种词条的估价,一般来说一个有效词条为1分,无效词条为0分(不出现在文件中)。
特别的,在目前代码中小攻击折算成0.5大攻击,小生命折算成0.5大生命
-
同时对于一些副词条区分重要度(什么样的圣遗物会看+20结果)
1表示见到之后只要有其他1个任意有效词条就会赌 0.99表示在没有1词条的情况下有三个才赌
-
特别的,在决定要不要赌词条时,考虑到有些角色有效词条种类过少,因此如果一个圣遗物已经出现了所有可能的有效副词条,那么哪怕只有一个也要赌(例如心海的生命沙出现充能)
首先通过决策与评分工具,来决定是否赌某个圣遗物,以及对赌满的圣遗物进行评分。
-
如果部位主词条不正确,直接记0分
-
如果主词条正确情况下,副词条不值得赌则以+4状态评分
实际代码中,相当于直接限制每个副词条数量最多为1。
-
如果值得赌则以满状态评分
通过这种方式就可以对任意一个圣遗物进行评分。
本文基于nga的数据统计贴圣遗物词条分布和掉落分布的推测进行单个圣遗物抽样模拟。
在已知圣遗物部位的情况下,首先根据统计贴中的数据随机抽取主属性,之后基于该主属性的副词条分布概率,按照该概率不放回的抽取四个副词条,并且以50%的概率决定该圣遗物初始为3词条或4词条(主要影响满强化的总词条数),这种方式能够模拟出抽取特定部位1次的圣遗物,配合上文的评分逻辑可以得到评分。通过抽样得到单个特定部件一抽的词条数量分布情况(记为Pa(m))。
在此基础上,我们对任意给定的抽数t,每个样本尝试抽取T个该部位圣遗物,取最高评分作为本次样本评分,即可得到某个特定部位圣遗物抽取T次后的最高词条概率分布情况(记为Ps(t, m))。(使用Pa(m)直接进行模拟可以回避底层的评分抽样逻辑,获得更快的采样速度))
假定我们要模拟抽取t次的情况,那么对于每次采样,首先基于概率均等的多项式分布获得五种部件的抽取次数(t1~t5),然后每个部位根据对应部位的抽取次数概率分布,基于Ps(t, m)模拟抽取得到本次样本最优的该部位词条数,最终将五个相加得到五件套采样情况。
特别的,对于4+1的模拟上,本项目假定一个套外套内圣遗物词条比Q(举例,如果你的总圣遗物1000,其中绝缘100,那么套外比套内为900:100=9),对于每个部位,分别进行ti次套内最优圣遗物抽取,以及Q*ti次套外圣遗物抽取,之后遍历所有情况找到总词条数最高的4+1组合(包括5+0),作为本次样本的词条数。作者目前根据自己仓库的统计为7(但是我把紫色的也一起算进去了,而且我已经把紫色绝缘都融了,这会对数值有较大的影响,可以根据自己情况修改)。
通过以上方式就可以抽样得到给定t个某套装部件的情况下,组合出的4+1总词条数的分布情况。
本项目使用Python开发,需要安装numpy作为依赖(偷懒不用自己写多项式分布采样(doge)
首先修改character_detail.txt,在其中加入/修改自己希望计算的角色的主词条、副词条要求:
- 第一行是角色名字(当然用奇怪的名字也无妨
- 第二行是有效主词条,以半角逗号分隔
- 特别的,为了方便代码实现,小攻击羽,小生命花是一直需要保留的
- 如果角色可以使用多种主词条,可以一并添加进去
- TODO 后续考虑允许对于一些次优主词条进行副词条减损(例如原来带元素伤害杯的,用攻击杯就当做少2个副词条一类的)
- 具体的合法表述是[主属性]+[部位],合法的主属性和部位可以查询drop_possibility_unicode.csv
- 第三行是有效副词条,以半角逗号分隔
- 每个副词条有两种描述方式,[副词条],以及[副词条=评分]
- 没有评分的认为是1.0分,即一个词条
- 参考核心逻辑部分,如果是有效,但是又没有那么让你想赌的词条(例如攻双爆的攻击),设置为0.99分
- 小生命、小攻击可以做折算,最终计算中会四舍五入
- 每个副词条有两种描述方式,[副词条],以及[副词条=评分]
接下来运行
python top_tester.py [你的角色名字]
例如:
python top_tester.py 雷电将军
程序会分别运行三层采样样本(其中前两层会保存缓存,方便后续对不同的抽数进行采样测试)
或者运行:
python top_tester.py all
此时程序会对所有已定义的角色进行模拟采样。
采样的结果输出到result_out.txt文件进行查看。
对于以下样例结果:
雷电将军
{
"27": 18.787850000000002,
"54": 23.21495,
"108": 27.5274,
"162": 29.98645000000001,
"216": 31.479249999999993,
"324": 33.50375,
"648": 36.26874999999999,
"1296": 38.19335
}
第一行表示当前分析的角色,接下来每一行前半部分表示抽取的该部位圣遗物数量(例如27个绝缘组件),右边表示在这个抽取数量下能够获得的有效词条数量数学期望。
特别的,本项目默认取数为作者的大概估计,在一周全部体力用来抽圣遗物的情况下,大概会有多少特定套件的圣遗物入手,分别是:一周、两周、一个月、一个版本(一个半月)、两个月、三个月、半年、一年。
如果希望更贴合自身需要,可以在top_tester.py中修改,这个修改不会影响对底层缓存的调用,但是要注意ps层的MAX_T必须要严格大于设置的t*Q的最大值。(否则极端情况会导致采样异常,虽然我觉得这种概率微乎其微)