网上商城积分抽奖系统

题目:派森网上商城为用户建立了积分系统。

为了回馈用户,于每周末举行抽奖活动。具体功能如
下:
一、 用户积分
每位用户有唯一的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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不是你的奥奥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值