本文目录导读:

我来介绍几种Python实现随机抽奖的常用方法:
使用random.choice() - 单次抽奖
import random
# 准备奖品和参与者
prizes = ['一等奖:iPhone 15', '二等奖:AirPods', '三等奖:保温杯']
participants = ['张三', '李四', '王五', '赵六', '钱七']
# 简单随机抽奖
winner = random.choice(participants)
prize = random.choice(prizes)
print(f"恭喜 {winner} 获得 {prize}")
带权重的抽奖系统
import random
class LotterySystem:
def __init__(self):
self.participants = []
self.prizes = []
def add_participant(self, name, weight=1):
"""添加参与者,weight为权重(中奖概率)"""
self.participants.append({'name': name, 'weight': weight})
def add_prize(self, name, quantity):
"""添加奖品"""
self.prizes.append({'name': name, 'quantity': quantity})
def draw_one(self):
"""抽取一个中奖者"""
if not self.participants:
return None
# 根据权重选择
weights = [p['weight'] for p in self.participants]
winner = random.choices(self.participants, weights=weights, k=1)[0]
return winner['name']
def draw_with_prizes(self):
"""抽取所有奖品"""
results = []
remaining_prizes = [p for p in self.prizes if p['quantity'] > 0]
while remaining_prizes and self.participants:
# 随机选择一个奖品
prize = random.choice(remaining_prizes)
# 抽奖
winner = self.draw_one()
if winner:
self.participants = [p for p in self.participants if p['name'] != winner]
prize['quantity'] -= 1
results.append(f"🎉 {winner} 获得 {prize['name']}")
# 更新剩余奖品
remaining_prizes = [p for p in self.prizes if p['quantity'] > 0]
return results
# 使用示例
lottery = LotterySystem()
# 添加参与者(可以设置权重)
lottery.add_participant('张三', weight=2) # 中奖概率更高
lottery.add_participant('李四', weight=1)
lottery.add_participant('王五', weight=1)
lottery.add_participant('赵六', weight=0.5) # 中奖概率较低
# 添加奖品
lottery.add_prize('一等奖:iPhone', 1)
lottery.add_prize('二等奖:iPad', 2)
lottery.add_prize('三等奖:蓝牙耳机', 3)
# 开始抽奖
results = lottery.draw_with_prizes()
for result in results:
print(result)
大转盘抽奖
import random
import time
class WheelLottery:
def __init__(self):
self.items = []
def add_sector(self, name, weight):
"""添加转盘扇区"""
self.items.append({'name': name, 'weight': weight})
def spin(self):
"""模拟转盘旋转并返回结果"""
print("转盘转动中...")
time.sleep(1)
# 模拟转盘旋转效果
for i in range(3):
print(f"{'=' * (i+1)} 转盘中...")
time.sleep(0.5)
# 选择结果
names = [item['name'] for item in self.items]
weights = [item['weight'] for item in self.items]
result = random.choices(names, weights=weights, k=1)[0]
return result
# 使用示例
wheel = WheelLottery()
wheel.add_sector('一等奖:海南双人游', 1)
wheel.add_sector('二等奖:电动牙刷', 5)
wheel.add_sector('三等奖:电影票', 20)
wheel.add_sector('谢谢参与', 74)
result = wheel.spin()
print(f"🎊 恭喜您获得:{result}")
完整抽奖系统(带历史记录)
import random
import json
from datetime import datetime
class CompleteLotterySystem:
def __init__(self):
self.participants = []
self.prizes = []
self.history = []
def add_participants(self, names):
"""批量添加参与者"""
for name in names:
self.participants.append({
'name': name,
'id': f'P{len(self.participants)+1:04d}'
})
def add_prizes(self, prizes_list):
"""批量添加奖品"""
for name, count in prizes_list:
self.prizes.append({
'name': name,
'count': count
})
def draw_by_category(self, category):
"""按类别抽奖"""
# 获取剩余该类别奖品
available_prizes = [p for p in self.prizes if p['count'] > 0]
if not available_prizes:
return None
# 随机选择一个奖品
prize = random.choice(available_prizes)
# 从参与者中抽取
if not self.participants:
return None
winner = random.choice(self.participants)
self.participants.remove(winner)
prize['count'] -= 1
# 记录历史
record = {
'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'winner': winner['name'],
'prize': prize['name'],
'category': category
}
self.history.append(record)
return record
def save_history(self, filename='lottery_history.json'):
"""保存抽奖历史"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.history, f, ensure_ascii=False, indent=2)
print(f"历史记录已保存至 {filename}")
# 使用示例
system = CompleteLotterySystem()
# 添加参与者
names = ['Alice', 'Bob', 'Charlie', 'David', 'Eve']
system.add_participants(names)
# 添加奖品
prizes = [
('iPhone 15 Pro', 1),
('AirPods Pro', 2),
('星巴克礼品卡', 5)
]
system.add_prizes(prizes)
# 进行抽奖
print("=== 年会抽奖系统 ===")
for _ in range(3):
result = system.draw_by_category('普通奖')
if result:
print(f"⭐ {result['winner']} 获得 {result['prize']}")
else:
print("奖品已抽完或参与者不足")
# 保存历史
system.save_history()
实际应用建议
# 防止重复中奖的抽奖系统
class FairLottery:
def __init__(self):
self.all_participants = set()
self.winners = set()
def lottery(self, participants, num_winners):
"""公平抽奖,确保不重复中奖"""
available = list(participants - self.winners)
if len(available) < num_winners:
print("参与人数不足!")
return []
winners = random.sample(available, num_winners)
self.winners.update(winners)
return winners
# 使用示例
lottery = FairLottery()
all_users = {'张三', '李四', '王五', '赵六', '钱七', '孙八'}
# 第一轮抽奖
winners1 = lottery.lottery(all_users, 2)
print(f"第一轮中奖者:{winners1}")
# 第二轮抽奖(不会重复中奖)
winners2 = lottery.lottery(all_users, 2)
print(f"第二轮中奖者:{winners2}")
简单命令行版本
import random
def simple_lottery():
print("=== 简易抽奖系统 ===")
# 输入参与者
participants = []
print("请输入参与者姓名(输入'结束'完成输入):")
while True:
name = input()
if name == '结束':
break
if name.strip():
participants.append(name.strip())
if not participants:
print("没有参与者!")
return
# 输入奖品
print(f"共{len(participants)}人参与,请输入中奖人数:")
try:
num = int(input())
if num > len(participants):
print("中奖人数不能超过参与人数!")
return
# 抽奖
winners = random.sample(participants, num)
print("🎉 中奖名单:")
for i, winner in enumerate(winners, 1):
print(f"{i}. {winner}")
except ValueError:
print("请输入有效数字!")
# 运行
simple_lottery()
这些方法可以根据实际需求选择合适的实现方式:
- 简单抽奖:使用
random.choice()或random.sample() - 加权抽奖:使用
random.choices()带权重参数 - 防重复抽奖:记录已中奖者
- 完整系统:结合文件存储、历史记录等
需要我帮你定制某种特定场景的抽奖系统吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播