背景:有个抽奖相关的需求,其中给定虚拟奖品的概率是95%,实物奖品的概率是5%,实物中又有很多价值不等的礼物,概率也不一样。想着写个脚本,把抽到的奖品记录下来,然后计算整体的抽奖概率。
写这个抽奖概率统计脚本思路:
1、第一步,请求抽奖接口,获取接口数据
2、接口中的rewardType,rewardName字段表示奖品的id和名称,其中rewardType<8时,都是虚拟奖品,大于8的都是实物奖品,就可以根据rewardType判断,在这5000次抽奖中,抽到了几次虚拟奖品,几次实物奖品,可以算出虚拟/实物奖品的概率
3、然后根据实物列表中,计算每个实物出现的次数,将重复的实物奖品以字典形式的输出
4、再根据每个实物出现的次数,计算概率
from time import sleep
import requests
from collections import Counter
def choujiang(**kwargs):
shiwu_num = 0 # 实物奖品数量
xuni_num = 0 # 虚拟奖品数量
testList = [] # 实物名称
totel = 5000 # 总的抽奖次数
headers_admin = {'content-type': 'application/x-www-form-urlencoded',
'ua': 'xxx',
'Cookie': 'xxx',
}
for i in range(totel):
# 第一步,请求抽奖接口,获取接口数据
result = requests.post("http://api.xxx.com/liveshow/activity/seventh/getReward", headers=headers_admin)
response = result.json()
print(response)
# 接口中的rewardType,rewardName字段表示奖品的id和名称,其中rewardType<8时,都是虚拟奖品,大于8的都是实物奖品
rewardType = response['data']['rewardType']
rewardName = response['data']['rewardName']
if rewardType < 8:
shiwu_num = shiwu_num + 1
testList.append(rewardName)
else:
xuni_num = xuni_num + 1
sleep(2)
print("\n*****一共抽奖%s次,抽到实物次数为:%s次,抽到虚拟奖品次数为:%s次*****\n" % (totel, shiwu_num, xuni_num))
print("抽取到的实物为:", testList)
# 计算每个实物出现的次数,将重复的实物奖品以字典形式的输出
chouzhong_shiwu = dict(Counter(testList))
print({key: value for key, value in chouzhong_shiwu.items() if value > 1})
# 出现的次数取出来,计算概率
avgDict = {}
for k, v in chouzhong_shiwu.items():
# v是每个实物出现的次数
avgDict[k] = v / float(totel) * 100
print("抽到%s的概率为:%.2f%%" % (k, avgDict[k]))
if __name__ == "__main__":
choujiang()
注意:这样计算也是看概率分布,不能百分百和产品/开发给出的概率一模一样,但是至少能验证整体的概率是否正确,并且能看出一些比较贵重实物,概率是否有很大的异常,让需求上线是自己心里也有底。可以把请求接口的次数调大一点,这样会更接近于给出的概率。