鱼C论坛

 找回密码
 立即注册
查看: 1146|回复: 2

[已解决]求助,老师弄了一个积分抽奖的程序设计怎么解决

[复制链接]
发表于 2023-5-5 11:57:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
嘶,这个程序设计感觉我现有的知识储备写不出来呀,有没有朋友感兴趣,指点迷津一下啊



积分抽奖
派森公司为用户建立了积分系统。为了回馈用户,于每周末举行抽奖活动。具体功能如下:
一、抽奖时段为每周六23:00~23:50,每十分钟开奖一次,每轮开奖各抽出一等奖1名和二等奖2名。
参与抽奖的人员信息存储在Candidates.csv文件中,每行为一个人的信息,包含:用户ID和积分,以逗号分隔。用户ID和积分都是大于等于0的整数。
每周抽奖开始后,从Candidates.csv文件读入候选名单。每个人每周抽奖最多只能中奖一次。
抽奖规则如下:
1.每十分钟一轮开奖,程序先从所有积分大于等于1000的人员中抽取1人为一等奖。
积分越高,中奖概率越大,具体规则如下:
积分在1000-2000之间的人员,中奖概率为正常一倍;
积分在2001-3000之间的人员,中奖概率为两倍;
积分在3001以上的人员,中奖概率为三倍。
请注意,各类人员的人数未必相等。
2.程序再从所有积分大于0的人员中抽取2人为二等奖。中奖概率均等。每轮开奖结束后,程序将屏幕输出中奖人员ID和中奖等级,并将中奖人员从候选名单中移除。如果当前轮次已经没有积分大于0的人员,则结束本周抽奖。
二、非抽奖时段内,用户的消费行为会增加数量不等的积分,用户的积分兑换行为会减少数
量不等的积分。程序模拟随机产生若干积分变动记录,新记录追加到updates.csv文件末尾。每行为一次变动记录,包含:用户ID和积分变动数量(正负整数)。本周抽奖时段到来时,读取updates.csv 中所有记录,汇总得到各用户的本周积分,写入Candidates.csv 文件(若文件已存在,清空原有内容)。最后一轮抽奖完成后,把updates.csv更名为当天日期,例如2023-04-28.csv。清空updates.csv所有内容,为下周做准备。相当于每周用户的积分会清零。
请注意,理论上抽奖时段内仍然有可能产生积分变动记录。但不论你的程序是否模拟产生这样的数据,都不影响抽奖的结果。


最佳答案
2023-5-5 12:00:59
根据题目要求,我们需要实现一个积分抽奖程序。为了帮助你更好地理解和实现这个程序,我将为你提供一个Python实现的解决方案。你可以根据以下代码和注释自行调整和优化。
import csv
import random
import time
import os

def load_candidates(file):
    candidates = {}
    with open(file, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            candidates[int(row[0])] = int(row[1])
    return candidates

def update_candidates(candidates, updates):
    with open(updates, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            user_id, points_change = int(row[0]), int(row[1])
            if user_id in candidates:
                candidates[user_id] += points_change
            else:
                candidates[user_id] = points_change
    return candidates

def save_candidates(file, candidates):
    with open(file, 'w', newline='') as f:
        writer = csv.writer(f)
        for user_id, points in candidates.items():
            writer.writerow([user_id, points])

def draw_lottery(candidates):
    first_prize_pool = [user_id for user_id, points in candidates.items() if points >= 1000]
    second_prize_pool = [user_id for user_id, points in candidates.items() if points > 0]

    # 抽一等奖
    weights = [1 if 1000 <= candidates[user_id] <= 2000 else 2 if 2001 <= candidates[user_id] <= 3000 else 3 for user_id in first_prize_pool]
    first_prize_winner = random.choices(first_prize_pool, weights, k=1)[0]
    print(f"一等奖得主: {first_prize_winner}")
    del candidates[first_prize_winner]

    # 抽二等奖
    if len(second_prize_pool) >= 2:
        second_prize_winners = random.sample(second_prize_pool, 2)
        print(f"二等奖得主: {second_prize_winners[0]}, {second_prize_winners[1]}")
        for winner in second_prize_winners:
            del candidates[winner]
    else:
        print("没有足够的人参加二等奖抽奖")

def main():
    candidates_file = "Candidates.csv"
    updates_file = "updates.csv"
    candidates = load_candidates(candidates_file)
    candidates = update_candidates(candidates, updates_file)
    save_candidates(candidates_file, candidates)

    while True:
        now = time.localtime()
        if now.tm_wday == 5 and 23 * 60 <= now.tm_hour * 60 + now.tm_min < 23 * 60 + 50:
            draw_lottery(candidates)
            time.sleep(10 * 60)
        else:
            break

    os.rename(updates_file, f"{time.strftime('%Y-%m-%d', now)}.csv")
    open(updates_file, 'w').close()

if __name__ == "__main__":
    main()

这个程序首先从Candidates.csv文件中加载用户数据,然后根据updates.csv中的积分变动记录更新用户积分。接下来,程序将在抽奖时段内每10分钟抽取一轮奖品,抽奖结束后将结果输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-5 12:00:59 | 显示全部楼层    本楼为最佳答案   
根据题目要求,我们需要实现一个积分抽奖程序。为了帮助你更好地理解和实现这个程序,我将为你提供一个Python实现的解决方案。你可以根据以下代码和注释自行调整和优化。
import csv
import random
import time
import os

def load_candidates(file):
    candidates = {}
    with open(file, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            candidates[int(row[0])] = int(row[1])
    return candidates

def update_candidates(candidates, updates):
    with open(updates, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            user_id, points_change = int(row[0]), int(row[1])
            if user_id in candidates:
                candidates[user_id] += points_change
            else:
                candidates[user_id] = points_change
    return candidates

def save_candidates(file, candidates):
    with open(file, 'w', newline='') as f:
        writer = csv.writer(f)
        for user_id, points in candidates.items():
            writer.writerow([user_id, points])

def draw_lottery(candidates):
    first_prize_pool = [user_id for user_id, points in candidates.items() if points >= 1000]
    second_prize_pool = [user_id for user_id, points in candidates.items() if points > 0]

    # 抽一等奖
    weights = [1 if 1000 <= candidates[user_id] <= 2000 else 2 if 2001 <= candidates[user_id] <= 3000 else 3 for user_id in first_prize_pool]
    first_prize_winner = random.choices(first_prize_pool, weights, k=1)[0]
    print(f"一等奖得主: {first_prize_winner}")
    del candidates[first_prize_winner]

    # 抽二等奖
    if len(second_prize_pool) >= 2:
        second_prize_winners = random.sample(second_prize_pool, 2)
        print(f"二等奖得主: {second_prize_winners[0]}, {second_prize_winners[1]}")
        for winner in second_prize_winners:
            del candidates[winner]
    else:
        print("没有足够的人参加二等奖抽奖")

def main():
    candidates_file = "Candidates.csv"
    updates_file = "updates.csv"
    candidates = load_candidates(candidates_file)
    candidates = update_candidates(candidates, updates_file)
    save_candidates(candidates_file, candidates)

    while True:
        now = time.localtime()
        if now.tm_wday == 5 and 23 * 60 <= now.tm_hour * 60 + now.tm_min < 23 * 60 + 50:
            draw_lottery(candidates)
            time.sleep(10 * 60)
        else:
            break

    os.rename(updates_file, f"{time.strftime('%Y-%m-%d', now)}.csv")
    open(updates_file, 'w').close()

if __name__ == "__main__":
    main()

这个程序首先从Candidates.csv文件中加载用户数据,然后根据updates.csv中的积分变动记录更新用户积分。接下来,程序将在抽奖时段内每10分钟抽取一轮奖品,抽奖结束后将结果输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-6 20:40:03 | 显示全部楼层
你好,以下是一个Python积分抽奖程序的示例代码,你可以根据自己的需求进行修改。这个程序使用了Python内置的random模块,可以实现从候选人名单中抽取一等奖和二等奖。在这个程序中,一等奖的中奖概率与积分成正比,二等奖的中奖概率均等。这个程序还使用了csv模块来读取和写入候选人名单。
import csv
import random

def read_candidates():
    candidates = []
    with open('Candidates.csv', 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            candidates.append(row)
    return candidates

def write_candidates(candidates):
    with open('Candidates.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        for row in candidates:
            writer.writerow(row)

def read_updates():
    updates = []
    with open('updates.csv', 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            updates.append(row)
    return updates

def write_updates(updates):
    with open('updates.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        for row in updates:
            writer.writerow(row)

def get_lottery_result(candidates):
    first_prize_candidates = [c for c in candidates if int(c[1]) >= 1000]
    if len(first_prize_candidates) == 0:
        return None
    first_prize_probabilities = [int(c[1]) for c in first_prize_candidates]
    first_prize_probabilities_sum = sum(first_prize_probabilities)
    first_prize_probabilities_normalized = [p / first_prize_probabilities_sum for p in first_prize_probabilities]
    first_prize_winner_index = random.choices(range(len(first_prize_candidates)), weights=first_prize_probabilities_normalized)[0]
    first_prize_winner_id = first_prize_candidates[first_prize_winner_index][0]
    
    second_prize_candidates = [c for c in candidates if int(c[1]) > 0 and c[0] != first_prize_winner_id]
    if len(second_prize_candidates) < 2:
        return None
    second_prize_winner_ids = random.sample([c[0] for c in second_prize_candidates], k=2)
    
    return (first_prize_winner_id, second_prize_winner_ids)

def run_lottery():
    candidates = read_candidates()
    updates = read_updates()
    
    for update in updates:
        candidate_index = next((i for i, c in enumerate(candidates) if c[0] == update[0]), None)
        if candidate_index is None:
            candidates.append([update[0], update[1]])
        else:
            candidates[candidate_index][1] = str(int(candidates[candidate_index][1]) + int(update[1]))
    
    lottery_results = []
    
    while True:
        lottery_result = get_lottery_result(candidates)
        if lottery_result is None:
            break
        lottery_results.append(lottery_result)
        
        candidates = [c for c in candidates if c[0] not in lottery_result]
        
    write_candidates(candidates)
    
    print('一等奖:')
    for result in lottery_results:
        print(result[0])
        
    print('二等奖:')
    for result in lottery_results:
        print(result[1][0])
        print(result[1][1])
        
run_lottery()
希望这个代码能够帮到你。如果你有任何问题或者需要进一步的帮助,请随时告诉我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表