抽奖现场那句「再抽一次」
60 人的年会抽 10 个奖,第一轮结束有人喊「再抽一次」,主持人一同意,上一轮中奖的人当场不干。争议不在结果,在流程:随机工具只保证这一次的结果无法预测,保证不了重抽之后仍然公平。抽奖前把规则、种子、记录方式说清楚,比事后解释省事得多。
不重复抽样有个硬上限
从 1 到 10 里抽 11 个不重复的数,数学上不存在——工具报错不是坏了,是在守边界。60 人里抽 10 个奖,中奖组合一共 75394027566 种,约合 754 亿;顺序无关时「谁中」的可能远多于「谁先中」。要排名次就抽两次:先抽中奖名单,再在名单内部排序。
600 次投骰能看出什么
六面骰投 600 次,每面期望 100 次——各面次数相加必须等于 600,这条守恒式是判断生成器是否正常的第一道关。真实分布会在 100 上下浮动,某面出现 0 次或 300 次就该怀疑实现。随机数生成器 一次生成一批,正好用来做这类分布观察。
伪随机不等于不可预测
浏览器 Math.random 走的是伪随机算法,种子可被推断,拿到足够多的输出就能预测后续值。密码、会话令牌、抽奖公证这类要求不可预测的场景,要换成 crypto.getRandomValues 或系统级随机源。
这些场合别用它
- 生成密码与会话令牌:需要密码学安全随机源,普通随机数强度不够
- 彩票摇号:要第三方公证的随机信标,自建工具说服力不足
- 涉及资金分配的抽签:随机只是辅助,规则与留痕才是关键
常见问题
- 抽奖该选可重复还是不可重复
- 奖品不能重复发出就选不重复;做模拟实验可以允许重复。
- 结果能复现吗
- 能,把种子记下来,同种子同序列。
- 刷新页面结果会变吗
- 会,每次加载重新取种子。
- 一次能生成多少条
- 受浏览器性能限制,几万条一般没问题,更大的量建议用脚本。