|
2023年3月31号,王者荣耀上线了王昭君星元宝藏抽奖,免费送一次抽奖,595元即可百分百获得奖池全部奖品。但各位朋友的目标肯定是为了王昭君的星传说皮肤,博主也从各种渠道了解到很多的朋友都是”黑手党“,抽奖的花费均在400、500以上。为了知道个人的手气属性以及了解本次活动抽奖的消费平均水平,个人消费处于平均水平的位置等问题,本次利用python简化模拟王者荣耀的星元抽奖活动,通过本次模拟,你可以无限次的畅玩抽奖,直到得到让你白嫖的次数;你也可以知道抽奖的平均花费,更可以知道你的消费处于广大网友的什么水平。基于计算机模拟,能让我们学习知识的同时也能理性消费(bushi),那么,show_TIME

活动图
依旧写在前面:本次简单模拟抽奖,,仅编写单抽模式,不考虑在各个层出现的随机点券折扣卡(太穷无法验证),召唤师可减去这部分金额,考虑了白送的一次抽奖机会,会在最后的金额计算中减去。
下面介绍建模过程,想看结论的小伙伴可直接跳转到最后查看。
第一步:创建星元宝藏抽奖类,实现星元宝藏的各个方法,例如,抽奖,构建抽奖区间,处理抽奖结果等等
import random as rd
class Lottery:
#奖品以及概率
def __init__(self):
self.lottery_times = 0 #抽奖次数
self.lottery_spend = 5 #单次抽奖购买金额
self.MAX_lottery_times = 120 #最大抽奖次数
self.floor_now = 0 #当前层数
self.best_reward_dict ={'星传说皮肤':0.0041,'星史诗套装武器自选礼盒':0.0059,'星史诗套装服饰自选礼盒':0.0117,"星史诗套装发型自选礼盒":0.0201, "星史诗独立武器自选礼盒":0.0065}
self.reward_dict = {"星元宝藏币":0.0483,"积分夺宝券":0.1407,"皮肤碎片*5":0.1903,"个性戳戳*5":0.1903,"亲密玫瑰*2":0.1903, "战令100经验礼包*10":0.2400}
#每一层的奖品数量
self.reward_number = {"星元宝藏币":[1,1,1,1,1],"积分夺宝券":[4,4,3,3,3],"皮肤碎片*5":[4,4,5,5,5],"个性戳戳*5":[4,4,5,5,5],"亲密玫瑰*2":[4,4,5,5,5],"战令100经验礼包*10":[7,7,5,5,5]}
self.best_reward_number ={'星传说皮肤':1,'星史诗套装武器自选礼盒':1,'星史诗套装服饰自选礼盒':1,"星史诗套装发型自选礼盒":1, "星史诗独立武器自选礼盒":1}
#构建抽奖区间
self.rate_result= self.get_lottery_interval(self.reward_dict)
self.best_result =self.get_lottery_interval(self.best_reward_dict)
def get_lottery_interval(self,key_dict): #构建中奖区间,宝藏区间
rate_result={}
temp=0
for index,rate in key_dict.items():
end=round(temp+rate,4)
rate=(temp,end)
rate_result.update({index:rate})
temp=end
return rate_result
def lottery_one(self): #抽奖一次
while True:
num_rand=round(rd.random(),4)
for k,v in self.rate_result.items():
if v[0]<=num_rand<v[1] : #k value 属于了奖品区间
if self.check_reward_exist(k):#没有这个奖品了,在抽一次
break
else: #还有这个奖品
self.reduce_reward_dict(k) #减去这个奖品数量
self.lottery_times+=1
return self.lottery_deal(k)
def lottery_deal(self,key): #处理并输出抽奖结果
if key==&#39;星元宝藏币&#39;:
if self.floor_now==5: #最后一层的宝藏币了,必须给你出星传说
return &#34;星传说皮肤&#34;
else:#如果不是最后一层,那就凭运气了
while True:
num =round(rd.uniform(0,0.0483),4)
for k,v in self.best_result.items():
if v[0]<=num<v[1] : #k value 属于了奖品区间
if self.best_reward_number.get(k)==0:
break
else:
self.best_reward_number[k]-=1
return k
else :
return key
def get_msg(self):#返回当前您的花费信息
return f&#34;您当前抽奖了{self.lottery_times}次,花费{self.lottery_times*self.lottery_spend-5}元&#34;
def check_reward_exist(self,key): #查询当前层是否还有目标奖品
return self.reward_number.get(key)[self.floor_now]==0
def reduce_reward_dict(self,key): #减少该层中的奖品数量,如果抽中了星元,则进入下一层
if key==&#39;星元宝藏币&#39;:
self.reward_number.get(key)[self.floor_now]-=1
self.floor_now+=1
else:
self.reward_number.get(key)[self.floor_now]-=1
第二步:写抽奖过程了,这里为了方便,我们就不构建类了,直接上才艺写抽奖程序
模拟一位用户抽奖直到抽到王昭君传说皮肤时抽奖的次数以及获得的奖励:
def get_pifu():#单个人抽到皮肤获得的东西与花费的金额
lott = Lottery() #创建星元对象
res = {} #存放这个人抽到的东西
while True:
lott_res = lott.lottery_one()
if lott_res not in res.keys():
res.update({lott_res:1})
else:
res[lott_res]=res.get(lott_res)+1
if lott_res ==&#39;星传说皮肤&#39; :
return lott.lottery_times,res
第三步:让我们首次进行抽奖(只能说太黑了,首次直接消费450,网友评论真实了)
get_pifu()

抽了91次,那么就是花费450元,直接五层拉满!!!
接下来我们来写一个创建很多个玩家能抽很多次皮肤的循环,在计算每次抽取的价格的均值,就能得到我们获取皮肤的平均值了
def get_pifu_times(n=1):#抽n个皮肤需要多少钱
spend = 0
for i in range(n):
times,_= get_pifu()
spend+=5*times
return int(spend/n)-5简简单单模拟以下10万人抽奖的平均消费吧
get_pifu_times(100000)

为什么要截图,因为怕你们不信
也就是说,人均抽到王昭君的新皮肤抽奖次数在50次左右,消费在250左右,大概三个史诗皮肤的价格。你,什么水平?
最后,我们在模拟10万人抽奖,得到这10万人的一个消费区间的对应人数以及概率,大家可以对比以下自己的消费,你是属于哪个区间。
#模拟10000名小伙伴抽奖,把他们的花费分一个等级
level =[0,0,0,0,0,0,0] #分别代表 1发入魂(5元),120元(一层拉满),240元,360元,480元,600元,600元(真的600黑化版)
for i in range(100000):
times,_ = get_pifu()
spend = times*5-5
if spend==0:
level[0]+=1
elif 0<spend<=115:
level[1]+=1
elif 115<spend<=235:
level[2]+=1
elif 235<spend<=355:
level[3]+=1
elif 355<spend<=475:
level[4]+=1
elif 475<spend<595:
level[5]+=1
else:
level[6]+=1
res_site = [&#34;一发入魂的欧皇(白嫖)&#34;,&#39;不到一个传说皮肤拿下(5-115)&#39;,&#39;平均值以下选手(120-235)&#39;,&#39;略微手气不佳(240-355)&#39;,&#39;中奖分母选手(360-475&#39;,
&#39;半黑化选手(480-590)&#39;,&#39;建议立刻出门买彩票(595)&#39;]
res = [{j:[{&#34;概率&#34;:round(i/sum(level),4),&#34;人数&#34;:i}]} for j,i in zip(res_site,level)]
让我们打印最后的结果:
res
--以下是结果:
[{&#39;一发入魂的欧皇(白嫖)&#39;: [{&#39;概率&#39;: 0.0041, &#39;人数&#39;: 407}]},
{&#39;不到一个传说皮肤拿下(5-115)&#39;: [{&#39;概率&#39;: 0.1512, &#39;人数&#39;: 15123}]},
{&#39;平均值以下选手(120-235)&#39;: [{&#39;概率&#39;: 0.2867, &#39;人数&#39;: 28670}]},
{&#39;略微手气不佳(240-355)&#39;: [{&#39;概率&#39;: 0.3536, &#39;人数&#39;: 35362}]},
{&#39;中奖分母选手(360-475&#39;: [{&#39;概率&#39;: 0.1816, &#39;人数&#39;: 18158}]},
{&#39;半黑化选手(480-590)&#39;: [{&#39;概率&#39;: 0.0227, &#39;人数&#39;: 2273}]},
{&#39;建议立刻出门买彩票(595)&#39;: [{&#39;概率&#39;: 0.0001, &#39;人数&#39;: 7}]}]如你所见,10万个童鞋,有407人通过白嫖成功获得了传说皮肤,但是也有7个大黑蛋子满入了本次抽奖活动,如果你消费在480以上的,你的黑化程度已经超过了96%的人,从分布来看,大多数人会消费在240-355之间居多哦!tx游戏,用薪创造快乐!
若需要尝试上诉代码,请尝试使用python命令行交互模式或使用带有python解释器的notebook或其他可交互的编辑模式!
结论:本次活动出王昭君传说星元皮肤,平均消费水平在250元左右,这样的价格,你薪动了吗? |
|