前言[Ado小白出品]
为实现个人发奖需求,紧急写的抽奖程序:共12题,每对三题概率翻倍,奖品有A,B两类,其中A类10种,B类3种,奖品需要满抽。
需要的库
这里主要用到两个库,random构成随机抽奖,pands读取Excel
import random
import pandas as pd
函数正文
总题目number 为12,r为加权函数,right为正确数。
加权规则为:每答对三题概论翻一倍
number = 12
def r(right):
if int(right) < 3: # 将字符串转换为整数
return 1
else:
return int(right) // 3
读取excel文件,假设文件名为data.xlsx,第一列为name,第二列为答对数
df = pd.read_csv('C://Desktop//roll.csv', header=None, names=['name', 'right'])
将DataFrame转换为字典,以name为键,答对数为值
participte = df.set_index('name')['right'].to_dict()
定义一个列表,存储每个人的name和r
poll = []
for name, right in participte.items():
# 根据r函数,将name重复添加到poll中
for i in range(r(right)):
poll.append(name)
定义一个字典,存储每个reward的类别和数量
reward = {"A": 10, "B": 3}
定义一个变量,存储需要抽取的人数
people = 13
从奖池中抽奖并去重
# 从poll中随机选择一个name
name = random.choice(poll)
# 从reward字典中随机选择一个reward
tY = random.choice(list(reward.keys()))
# 如果reward数量大于0,说明还有剩余的reward
if reward[tY] > 0:
# 打印中奖者的name和tY
print("{}中了{}!".format(name, tY))
while name in poll:
poll.remove(name)
# 从reward数量中减一
reward[tY] -= 1
# 从people中减一
people -= 1
# 从poll中移除该name,避免重复抽取
poll = [x for x in poll if x != name]