随机抽奖工具
粘贴名单就能抽,支持权重、必中名单、随机分组与滚动动画,全程本地运行。
隐私安全:所有处理均在您的浏览器本地完成,数据绝不上传① 名单
每行一个人,可写成「名称,权重」(权重 1~99,省略即 1)。支持从表格直接粘贴,重复名称会自动去重。
输入后会自动生效,无需手动保存。
高级设置:权重表 / 必中名单
必中名单中的人本轮必定出现在结果里,界面上不会有任何标记(仅组织者知晓,适合节目效果)。
| 名称 | 权重(1~99) | 必中 |
|---|
② 抽奖模式
抽奖舞台
按「开始抽奖」按钮或空格键开始。
③ 记录与统计
工作原理
- 1随机源优先使用浏览器加密安全随机数 crypto.getRandomValues;若页面处于非安全上下文(部分 http 环境)则回退到 Math.random 并在页面上明确提示。
- 2取随机整数时使用拒绝采样:先剔除无法被范围整除的尾部区间再取模,避免 x % n 带来的取模偏差,保证每个取值概率完全相同。
- 3加权抽取用「前缀和 + 二分查找」实现:权重是 1~99 的整数,在 [0, 权重和) 上取一个均匀随机整数,落入哪个区间就交给对应的人,命中概率精确等于权重占比。
- 4必中名单在本轮优先入选(从必中集合里随机取,顺序也打乱),剩余名额再按权重从普通名单里抽;界面不会暴露任何必中痕迹。
- 5动画只负责表现:结果在动画开始前就已确定,名字用 requestAnimationFrame 恒速滚动 70% 时间,再用 cubic ease-out 逐渐减速定格,全程不阻塞主线程,可随时跳过。
常见问题
抽取结果真的是随机的吗?公平吗?
是。所有随机数都来自浏览器的 crypto.getRandomValues(加密安全随机源),并且取随机整数时用了拒绝采样来消除取模偏差。代码完全在本地运行,没有任何隐藏的排序、黑名单或服务器干预,你可以用页面里的「公平性自测」跑 10 万次模拟,对比理论概率与实测频率。
怎么设置权重?比如想让某人的中奖概率高 3 倍?
在名单里写成「张三,1」和「李四,3」即可,权重范围 1~99,省略时默认为 1。抽取时按权重占比计算概率,上面这个例子里李四的中奖概率是张三的 3 倍(3/4 与 1/4)。如果所有人权重相同,就等价于均匀随机。
必中名单是什么?别人能看出来吗?
必中名单是组织者私下指定的、本轮必须出现在结果中的人。抽取时会先从未被抽中的必中者里随机取(顺序也打乱),再补齐剩余名额,所以从动画和结果上完全看不出任何标记,适合直播或活动做节目效果。
「一次抽 N 个」会重复抽到同一个人吗?
默认不会。勾选「去掉已抽中的人」后,同一个人在同一轮以及之后的轮次里都不会重复中奖,抽完名单里的人会提示重置。取消勾选则允许重复中奖(有放回抽样)。
数据会保存吗?刷新后名单还在吗?
名单、必中设置和中奖记录都保存在你自己浏览器的 localStorage(键名 toolonline-lucky-draw)中,刷新或关闭页面后再次打开会自动恢复。清除浏览器数据会导致记录丢失,重要结果请及时用「导出 CSV」保存。
为什么页面提示随机源回退到了 Math.random?
crypto.getRandomValues 只在安全上下文(HTTPS 或 localhost)可用。如果你用 http 协议或通过某些内嵌方式打开页面,浏览器会禁用它,此时工具会自动回退到 Math.random 保证功能可用,但随机质量较弱,建议改用 HTTPS 访问。