市面上氪金抽卡类的手游越来越多,许多玩家在抽卡时抱怨脸黑,很难抽到所需要的卡牌,而又有一部分玩家反应运气好能连着抽到紫卡。
而当这些游戏的开发者检查随机相关的逻辑代码,往往又找不出错误。最后往往是将这些归咎于玩家个人的“脸黑”与“脸白”。
其实不然,当前市面上大部分游戏策划,使用权值来分配随机概率。举例来说,白卡30,紫卡15,金卡5。最后转为概率则是白卡50%,紫卡30%,金卡10%。
权值有一个好处,就是在需要更改奖池的内容时(如增加新产物或删除旧产物),可以不对之前的配置进行更改。
但是放到实际中,给人的感觉是怎样的呢?
我们使用权值5和95为例,模拟抽卡50000次。
import random as rd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd from pandas
import DataFrame
data = np.random.randint(1,100,size=50000)
df1 = DataFrame(np.argwhere(data<=5))
df1=df1-df1.shift(1)df1 = df1.dropna()
sns.distplot(df1,bins=50)
plt.show()
最后我们得到一个分布图
横坐标为出现频率,纵坐标为两次抽到权值5的间隔。
按照正常的情况来说,5%的概率大约是每隔20次出现一次。但实际的分布情况并不是这样。往往是抽中过一次之后,立刻就能再次获得一个。
这就符合了玩家所吐槽的抽卡情况。
但是从统计意义上来说,50000次抽取中出现了2600次抽取,这是符合概率的。
这问题说到底,就是我们游戏中所提及的概率,到底是统计意义上还是分布意义上的问题。
很明显,当概率是分布意义上的概率时,玩家的体验会更好。
因为大部分玩家抽卡数量有限,无法感觉到统计意义上的概率,更多的人是按照自己的体验——也就是分布概率来判断奖池的实际概率。
可以参考的解决方案
这里提供一种解决方案。
我认为使用正态分布作为抽卡的概率分布是可行的。
下面直接给出使用正态分布的抽卡间隔情况。取μ=20,σ=20/3。
我们只要将分布的情况转化为正态分布类型,就可以获得既具有随机性又可控的随机概率了。
具体怎么生成符合正态分布的随机数,这里不过多阐述。有兴趣的可以参考Python中random库中的normalvariate函数,或者gauss函数。