鱼C论坛

 找回密码
 立即注册
查看: 1708|回复: 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实现的解决方案。你可以根据以下代码和注释自行调整和优化。

  1. import csv
  2. import random
  3. import time
  4. import os

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

  12. def update_candidates(candidates, updates):
  13.     with open(updates, 'r') as f:
  14.         reader = csv.reader(f)
  15.         for row in reader:
  16.             user_id, points_change = int(row[0]), int(row[1])
  17.             if user_id in candidates:
  18.                 candidates[user_id] += points_change
  19.             else:
  20.                 candidates[user_id] = points_change
  21.     return candidates

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

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

  30.     # 抽一等奖
  31.     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]
  32.     first_prize_winner = random.choices(first_prize_pool, weights, k=1)[0]
  33.     print(f"一等奖得主: {first_prize_winner}")
  34.     del candidates[first_prize_winner]

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

  43. def main():
  44.     candidates_file = "Candidates.csv"
  45.     updates_file = "updates.csv"
  46.     candidates = load_candidates(candidates_file)
  47.     candidates = update_candidates(candidates, updates_file)
  48.     save_candidates(candidates_file, candidates)

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

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

  58. if __name__ == "__main__":
  59.     main()
复制代码


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

使用道具 举报

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

  1. import csv
  2. import random
  3. import time
  4. import os

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

  12. def update_candidates(candidates, updates):
  13.     with open(updates, 'r') as f:
  14.         reader = csv.reader(f)
  15.         for row in reader:
  16.             user_id, points_change = int(row[0]), int(row[1])
  17.             if user_id in candidates:
  18.                 candidates[user_id] += points_change
  19.             else:
  20.                 candidates[user_id] = points_change
  21.     return candidates

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

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

  30.     # 抽一等奖
  31.     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]
  32.     first_prize_winner = random.choices(first_prize_pool, weights, k=1)[0]
  33.     print(f"一等奖得主: {first_prize_winner}")
  34.     del candidates[first_prize_winner]

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

  43. def main():
  44.     candidates_file = "Candidates.csv"
  45.     updates_file = "updates.csv"
  46.     candidates = load_candidates(candidates_file)
  47.     candidates = update_candidates(candidates, updates_file)
  48.     save_candidates(candidates_file, candidates)

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

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

  58. if __name__ == "__main__":
  59.     main()
复制代码


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

使用道具 举报

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

  3. def read_candidates():
  4.     candidates = []
  5.     with open('Candidates.csv', 'r') as f:
  6.         reader = csv.reader(f)
  7.         for row in reader:
  8.             candidates.append(row)
  9.     return candidates

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

  15. def read_updates():
  16.     updates = []
  17.     with open('updates.csv', 'r') as f:
  18.         reader = csv.reader(f)
  19.         for row in reader:
  20.             updates.append(row)
  21.     return updates

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

  27. def get_lottery_result(candidates):
  28.     first_prize_candidates = [c for c in candidates if int(c[1]) >= 1000]
  29.     if len(first_prize_candidates) == 0:
  30.         return None
  31.     first_prize_probabilities = [int(c[1]) for c in first_prize_candidates]
  32.     first_prize_probabilities_sum = sum(first_prize_probabilities)
  33.     first_prize_probabilities_normalized = [p / first_prize_probabilities_sum for p in first_prize_probabilities]
  34.     first_prize_winner_index = random.choices(range(len(first_prize_candidates)), weights=first_prize_probabilities_normalized)[0]
  35.     first_prize_winner_id = first_prize_candidates[first_prize_winner_index][0]
  36.    
  37.     second_prize_candidates = [c for c in candidates if int(c[1]) > 0 and c[0] != first_prize_winner_id]
  38.     if len(second_prize_candidates) < 2:
  39.         return None
  40.     second_prize_winner_ids = random.sample([c[0] for c in second_prize_candidates], k=2)
  41.    
  42.     return (first_prize_winner_id, second_prize_winner_ids)

  43. def run_lottery():
  44.     candidates = read_candidates()
  45.     updates = read_updates()
  46.    
  47.     for update in updates:
  48.         candidate_index = next((i for i, c in enumerate(candidates) if c[0] == update[0]), None)
  49.         if candidate_index is None:
  50.             candidates.append([update[0], update[1]])
  51.         else:
  52.             candidates[candidate_index][1] = str(int(candidates[candidate_index][1]) + int(update[1]))
  53.    
  54.     lottery_results = []
  55.    
  56.     while True:
  57.         lottery_result = get_lottery_result(candidates)
  58.         if lottery_result is None:
  59.             break
  60.         lottery_results.append(lottery_result)
  61.         
  62.         candidates = [c for c in candidates if c[0] not in lottery_result]
  63.         
  64.     write_candidates(candidates)
  65.    
  66.     print('一等奖:')
  67.     for result in lottery_results:
  68.         print(result[0])
  69.         
  70.     print('二等奖:')
  71.     for result in lottery_results:
  72.         print(result[1][0])
  73.         print(result[1][1])
  74.         
  75. run_lottery()
复制代码

希望这个代码能够帮到你。如果你有任何问题或者需要进一步的帮助,请随时告诉我。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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