讲师中心 微信公众号
AI工具推荐 视频效率加速

Sublime开发抽奖系统随机算法模块_包含权重设置与中奖名单导出

酷瑶小哥_2435

酷瑶小哥_2435

发布时间:2026-04-21 21:48:26

|

631人浏览过

|

来源于php中文网

原创

random.choices() 更适合抽奖权重逻辑,因其支持 weights 参数按比例分配概率、允许重复抽取,而 random.choice() 无法实现加权;需手动处理不放回抽样、去重及导出校验。

sublime开发抽奖系统随机算法模块_包含权重设置与中奖名单导出

为什么 random.choices() 比 random.choice() 更适合抽奖权重逻辑

因为 random.choice() 对所有选项一视同仁,没法表达“iPhone 中奖概率是纸巾的 10 倍”这种业务需求;而 random.choices() 支持 weights 参数,直接按数值比例分配概率,且允许重复抽中(比如多人可同时中同一奖品),符合真实抽奖场景。

注意:权重不要求归一化,[10, 1, 5] 和 [100, 10, 50] 效果一致;但必须是正数,传负数或零会抛 ValueError: weights must be non-negative。

  • 若需「不放回」抽(每人仅中一次、奖品不可重复),得自己维护已抽列表 + 动态更新剩余权重,不能只靠 random.choices() 一步到位
  • k 参数控制抽取次数,设为 1 是单次抽奖,设为 10 就是一次出 10 个中奖者(可能重复)
  • Python 3.6+ 才有 random.choices(),旧版本得用 numpy.random.choice() 或手写累积权重二分查找

导出中奖名单时,csv.writer 比 pandas.DataFrame.to_csv() 更轻量也更可控

抽奖模块通常不需要分析、透视或缺失值处理,只是把 name、prize、timestamp 三列原样存成 Excel 可打开的表格。用 pandas 会多引入依赖、启动慢,还容易因默认参数导致中文乱码或索引列多出一列。

直接用标准库 csv 模块,配合 open(..., encoding='utf-8-sig') 即可兼容 Windows Excel 的 UTF-8 BOM 识别:

import csv
with open('winners.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerow(['姓名', '奖项', '抽中时间'])
    for name, prize in winners:
        writer.writerow([name, prize, datetime.now().strftime('%Y-%m-%d %H:%M:%S')])
  • 务必加 newline='',否则 Windows 下用 csv.writer 会空一行(Python 文档明确要求)
  • utf-8-sig 编码比纯 utf-8 多写 BOM 头,Excel 才能正确识别中文
  • 如果名单要带序号(第1名、第2名),别用 enumerate() 后再写,直接在 writerow 里拼 [i+1, name, prize, ...]

Sublime Text 里调试权重抽奖逻辑,别依赖 print(),用 subprocess.run() 调 Python 解释器更可靠

Sublime 是编辑器,不是 IDE,没内置变量监视或断点。写完 draw_prize(weights=[...]) 后想验证结果分布是否符合预期,靠肉眼看几次 print() 输出完全不可靠——小样本偏差太大。

推荐写个最小验证脚本,用 subprocess.run() 批量跑 10000 次,再统计频次:

import subprocess
result = subprocess.run(
    ['python', '-c', '''
import random
weights = [70, 20, 10]  # 一等奖:二等奖:三等奖
samples = [random.choices(["A", "B", "C"], weights=weights)[0] for _ in range(10000)]
print({k: v/10000 for k, v in __import__("collections").Counter(samples).items()})
'''],
    capture_output=True, text=True
)
print(result.stdout)
  • 这样避免在 Sublime 控制台里反复手动运行,也绕过插件对 sys.stdout 的劫持问题
  • 权重和样本数写死在命令行字符串里,改起来快,不用切文件、保存、再运行
  • 如果发现实际比例严重偏离(如 70:20:10 抽出来变成 65:25:10),大概率是权重数组里混入了浮点误差或隐式类型转换(比如从 JSON 读进来变成 70.0,但 random.choices 接受)

导出名单前必须校验中奖者是否重复,尤其当 k > 1 且未禁用重复时

业务上常要求“同一人不能重复中奖”,但 random.choices() 默认允许重复。如果没做去重,导出的 CSV 里可能出现张三中两次一等奖——这在审计或发奖时就是事故。

简单去重不等于用 set(),因为顺序会丢、且无法处理“张三中一等奖,李四中二等奖,张三再中三等奖”这类合法重复(不同奖)。正确做法是按业务规则定义“重复”:

  • 若“每人限中一个奖”,抽完立刻用 dict 记录 {name: prize},后续再抽到已存在 name 就跳过并重抽
  • 若“每人每个奖限中一次”,得用 set 存 (name, prize) 元组
  • 导出前加一行 assert len(winners) == len(set(w[0] for w in winners)),测试环境直接崩给你看,比上线后被投诉强

权重算法本身不保证唯一性,去重逻辑必须显式写清楚,藏在“抽完再 dedup”这种模糊表述里,迟早出问题。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6316

2023.08.14

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

0

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn