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

酷瑶小哥_2435

酷瑶小哥_2435

2026-04-21

631人浏览

原创

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() 输出完全不可靠——小样本偏差太大。

数眼智能AI
数眼智能AI

数眼智能AI是一款AI大模型工具,企业级AI数据与模型服务平台。

下载

推荐写个最小验证脚本,用 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”这种模糊表述里,迟早出问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sublime

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.08.14

6296

4

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

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

2026.10.22

100

11

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

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

2026.10.22

60

10

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

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

2026.10.22

60

15

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

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

2026.10.22

20

10

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

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

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

40

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

280

12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程