题目:派森网上商城为用户建立了积分系统。
为了回馈用户,于每周末举行抽奖活动。具体功能如
下:
一、 用户积分
每位用户有唯一的ID,每周初始积分为0。程序不定时随机产生某位用户的积分变动事
件,来模拟真实世界中用户造成积分变动的行为。
积分变动事件有两种:
1. 用户的消费行为会增加数量不等的积分;
2. 用户的积分兑换行为会减少数量不等的积分。如果用户ID 不存在或者该用户当前
积分不足,则该事件无效。
程序不定时随机产生上述两种事件,其中的有效事件需要追加到updates.csv 文件末尾
(若文件不存在则新建)。文件每行为一次变动记录,包含:用户ID 和积分变动数量
(正负整数)。将该次积分变动显示在屏幕上。
每周抽奖开始后,积分冻结,不再变动。抽奖结束后所有用户的积分清零。
二、 积分抽奖
抽奖时段为每周六23:00~23:40,每20 分钟开奖一次,共3 轮。每轮开奖各抽出一等
奖1名和二等奖2名。每个人每周抽奖最多只能中奖一次。
每周第一轮抽奖开始时,将所有用户的当前积分信息写入Candidates.csv 文件中(若文
件已存在,清空原有内容)。每行为一个人的信息,包含:用户ID 和当前积分,以逗号分
隔。用户ID和积分都是大于等于0的整数。将所有用户的当前积分显示在屏幕上。
每轮抽奖规则如下:
1. 程序先从所有积分大于等于1000的人员中抽取1人为一等奖。积分越高,中奖概
率越大,具体规则如下:
积分在1000-1999之间的人员,中奖概率为正常一倍;
积分在2000-2999之间的人员,中奖概率为两倍;
积分在3000以上的人员,中奖概率为三倍。
请注意,若无任何人员满足积分条件,则一等奖空缺。
2. 程序再从所有积分大于0 的人员中抽取2 人为二等奖。中奖概率均等。若满足积
分条件人员不足,二等奖可以空缺。
每轮开奖结束后,程序将屏幕输出中奖人员ID 和中奖等级,并将中奖人员从候选名单
中移除。
如果本轮已经没有积分大于0的人员,则结束本周抽奖。
本周抽奖结束后,把updates.csv更名为当天日期(例如2023-04-28.csv),作为存档备
案。然后程序结束。
积分变动:
2 +500
0 +1000
4 +4000
3 +100
2 +1000
0 -100
5 +1000
5 -1000
当前用户积分:
2 : 1500
0 : 900
4 : 4000
3 : 100
5 : 0
抽奖开始:
第1轮:
2 一等奖
3 二等奖
4 二等奖
第2轮:
0 二等奖
本周抽奖结束
代码一:
import csv
import random
import os
from datetime import date
# 设置文件名
candidates_file = "./Candidates.csv"
updates_file = "./updates.csv"
# 定义生成用户ID函数
def generate_user_id(num):
return [str(i + 1) for i in range(num)]
# 定义创建候选者记录函数
def create_candidate_records(num):
candidates = []
user_ids = generate_user_id(num)
for user_id in user_ids:
candidates.append({"ID": user_id, "Score": 0})
# 写入文件
with open(candidates_file, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=candidates[0].keys())
writer.writeheader()
writer.writerows(candidates)
print(f"{len(candidates)} candidate records created.")
# 生成随机用户ID和积分变动数量
def random_user_scores(num):
user_ids = generate_user_id(100)
selected_ids = random.sample(user_ids, num)
score_changes = [random.randint(-100, 1000) for i in range(num)]
return list(zip(selected_ids, score_changes))
# 写入更新记录文件
def update_scores():
# 生成随机用户ID和积分变动数量
updated_records = random_user_scores(5)
# 写入文件
with open(updates_file, 'a', newline='') as f:
writer = csv.writer(f)
for record in updated_records:
# 元组解包
user_id, score_change = record
writer.writerow(record)
print(f"ID: {user_id}, 变动数量: {score_change}")
# 运行积分更新并记录
for i in range(2):
update_scores()
def update_candidate_scores():
# 读取候选者记录
with open(candidates_file, 'r', newline='') as f:
reader = csv.DictReader(f)