欢迎光临散文网 会员登陆 & 注册

抽卡机制分析工具分享

2021-03-06 17:24 作者:一棵平衡树  | 我要投稿

前言

        凭兴趣研究原神抽卡系统的设计也有一段时间了,这里分享一下我的一些研究方法。本文提到的方法都是很经典且通用的方法,可以解决各类实际问题,当然也可以用于设计游戏的各种数值系统。由于我数学不是很好,所以行文难免冗长,请多多包涵。

*本文提及的综合概率意为抽卡次数趋于无穷时,抽出来的物品比上总抽数的比值。

数据获取

        对于统计分析工作,无论使用的方法有多先进,一份来源可靠且数量足够的数据都是必须的。我尝试过通过收集身边人的抽卡记录、看主播抽卡视频、弹幕收集出货记录等方法来收集数据,这些办法效率都比较低,并且收集到的数据准确度存疑。后来得益于一些抽卡记录导出工具,我得以获取大量详细且无错误的抽卡记录,我已经将获得的抽卡记录放在GitHub上的GI_gacha_dataset项目中。

数据处理

1. 选取最佳估计值

        如果你已经得到了大量数据,怎样估计抽卡系统的概率呢?拿原神的抽卡系统举例,由于五星90抽保底,如果当前统计的五星道具获取抽数+此后记录中剩余抽数不足90抽,则应该舍去本次记录。在保留的记录中取每次获取五星物品时使用的抽数作为参考抽数,将保留记录中五星总数比上参考抽数的比值作为综合概率的估计量。

        为什么要这样呢?举个简单的例子,若收集到的数据中每个玩家只抽了十次,都没有触发抽卡概率上升段。按照总抽出五星数比上总抽数得到的值,随着收集到的数据增加,是趋于0.6%而不是1.6%的。由于玩家总抽数是有限的,所以根据保底抽数舍去部分记录才可以保证无偏记录。因此,分析各种抽卡系统都要恰当的选取综合概率估计量,否则得到的结果会是有偏的。

2. 绘制分布图

        很多信息被隐藏在分布中,分布刻画了比均值、方差这些统计量多得多的信息,同时分布也能够帮助你在噪声中提取信息。多绘制分布图可以找出不同模型间细微的差距。

模型综合概率评估方法

        为了保证玩家的抽卡体验,现在的抽卡机制都会比较复杂,其综合概率难以简单的直接算出,因此在设计这类抽卡机制时需要借助其他工具辅助计算概率。

1. 蒙特卡洛模拟法

        又称统计试验法,思想是通过对某一随机事件进行大量模拟,以随机事件出现的频率估计其概率。此方法优点是能够解决有统计性质的问题,相较于其他方法可以快速估算十分复杂的模型的概率。缺点是随机模拟始终有误差,不能得到精确值,想要提高精度时计算量大。

举例:现有一抽卡模型,抽到某物品的概率初始为1%,每次抽卡没有抽到此物品时,下次抽到本物品的概率上升1%,抽到了此物品时下次抽卡抽到此物品的概率重置为0。问抽到特定物品的综合概率是多少?

        最朴素的想法是模拟抽一千万次,观察抽取物品出现的频率,用频率来估计综合概率。

        运行一次代码,模拟一千万次抽卡后,一共抽到了819161次物品,认为综合概率约8.19%

        但是由于随机性,每次运行得到的值都会不一样。朴素的做法无法得知估计概率的精确度如何,这个时候需要对朴素的方法进行改进。寻找一个满足重复试验独立同分布的随机变量以应用大数定律,这里选取抽到物品需要的抽数。抽取很多次物品,每次抽到物品花费的抽数是独立同分布的随机变量序列,可对其运用中心极限定理获知花费抽数的平均值近似于服从正态分布。

        以上代码具体说明略。运行以上代码,给出了一个8.187%到 8.203%的区间,实际值落在这个区间内的可能性约为95%,虽然每次运行得到的区间会不一样,但是我们知道了得到数字的置信水平。要提高模拟的精度实际上就是减小这个区间的长度。由中心极限定理,要让区间缩小十倍,模拟次数需要变为原本的一百倍,因此想要提高模拟值的精度计算开销很大。

2. 使用期望计算综合概率

        随机变量的数学期望又称均值,对于离散的变量X其期望为E(X)%3D%5Csum_%7Bi%3D1%7D%5E%7B%2B%5Cinfty%7Dx_ip_i

举例:同样对于以上模型,用数学期望计算综合概率。

        设在第i抽抽到物品的概率为p_i。由于抽卡规则保证依照数学期望的定义,抽到物品花费的平均抽数为E(X)%3D%5Csum%5Cnolimits_%7Bi%3D1%7D%5E%7B100%7Di%5Ccdot%20%20p_i,取期望抽数的倒数1%2FE(X)即是综合概率。

        计算得此模型抽到物品的综合概率为8.19003%,这个值的误差只取决于计算机浮点误差。

3. 使用概率转移矩阵计算概率

        很多复杂的模型期望难算,并不适合采用期望去计算综合概率。

        网友Labrarinth指出可以使用概率转移矩阵计算,这个方法非常经典且通用,概念更明确直观,并能处理较复杂的问题。

举例:现有一抽卡模型有A/B两种物品,A物品的初始概率为50%,B物品的初始概率为10%。当上一次没有抽到A物品时,本次一定能抽到A物品。问抽到A/B物品的综合概率各是多少?

        这个抽卡模型满足一阶马尔科夫性质,每次抽卡抽到特定物品的概率只和前一次抽卡有关。

本次抽到物品关于上次抽到物品的条件概率分布律

        可以画出状态转移图

举例抽卡模型的概率转移图

        设某时刻的状态可以用一个向量X_t来表示,其中P_A表示本抽抽到A物品的概率,P_B表示本抽抽到B物品的概率,P_N表示本抽没抽到的概率,则下一个时刻的状态向量X_%7Bt%2B1%7D%3DM%5Ccdot%20X_%7Bt%7D

X_%7Bt%2B1%7D%3D%0A%5Cleft%5B%0A%5Cbegin%7Bmatrix%7D%0A%5Cfrac%7B1%7D%7B2%7D%20%20%26%201%20%20%261%5C%5C%0A%5Cfrac%7B1%7D%7B10%7D%20%20%26%200%20%20%260%5C%5C%0A%5Cfrac%7B2%7D%7B5%7D%20%20%26%200%20%20%260%5C%5C%0A%5Cend%7Bmatrix%7D%0A%5Cright%5D%0A%5Ccdot%20X_t%0A%5Cquad%5Cquad%0AX_t%3D%0A%5Cleft%5B%0A%5Cbegin%7Bmatrix%7D%0AP_A%5C%5C%0AP_B%5C%5C%0AP_N%5C%5C%0A%5Cend%7Bmatrix%7D%0A%5Cright%5D

        想要知道抽数趋于无穷时的综合概率,即求X_%7Bt_%5Cinfty%7DP_AP_B的值。由于马尔科夫概率转移矩阵最大特征值为1,当概率转移矩阵相乘次数趋于无穷时,趋于取特征值1对应的特征向量%5Cleft%5B%0A%5Cbegin%7Bmatrix%7D%0AA%26B%26N%5C%5C%0A%5Cend%7Bmatrix%7D%0A%5Cright%5D%5E%7BT%7D%7BA%7D%2F(%7BA%2BB%2BN%7D)%2C%20%7BB%7D%2F(%7BA%2BB%2BN%7D)即是A/B对应的综合概率。

        计算可知A物品的综合概率为2/3,B物品的综合概率为1/15。

4. 动态规划

        动态规划也是一种常用的方法。在这里动态规划的方法和概率转移矩阵的方法本质上是相同的,都是依赖某时刻的抽卡结果仅和过去的抽卡结果相关的性质。不同之处是动态规划可以更自由的设计状态,研究复杂的问题。

举例:对于以上模型,计算第5次抽卡后抽到至少4个A物品的概率。

        定义状态S%5Bi%5D%5Bj%5D%5B1%5D表示第i次抽卡后抽到了A物品,并累计抽到了j个A物品的状态,S%5Bi%5D%5Bj%5D%5B0%5D表示第i次抽卡后没有抽到A物品,但累计抽到了j个A物品的状态。

        写出状态转移方程:

S%5Bi%5D%5Bj%5D%5B0%5D%3D%5Cfrac%7B1%7D%7B2%7D%20S%5Bi-1%5D%5Bj%5D%5B1%5D%5C%5CS%5Bi%5D%5Bj%5D%5B1%5D%3D%5Cfrac%7B1%7D%7B2%7D%20S%5Bi-1%5D%5Bj-1%5D%5B1%5D%2BS%5Bi-1%5D%5Bj-1%5D%5B0%5D

        置初始状态S[0][0][1]=1,进行递推后取出S[5][4][1]、S[5][5][1]、S[5][4][0]之和0.3125即为所求。


抽卡机制分析工具分享的评论 (共 条)

分享到微博请遵守国家法律