随机数生成教程

60 人抽 10 个奖该怎么定规则,不重复抽样为什么有上限,600 次投骰怎样看出生成器是否正常。讲清随机数在抽奖与抽样里的用法边界。

抽奖现场那句「再抽一次」

60 人的年会抽 10 个奖,第一轮结束有人喊「再抽一次」,主持人一同意,上一轮中奖的人当场不干。争议不在结果,在流程:随机工具只保证这一次的结果无法预测,保证不了重抽之后仍然公平。抽奖前把规则、种子、记录方式说清楚,比事后解释省事得多。

不重复抽样有个硬上限

从 1 到 10 里抽 11 个不重复的数,数学上不存在——工具报错不是坏了,是在守边界。60 人里抽 10 个奖,中奖组合一共 75394027566 种,约合 754 亿;顺序无关时「谁中」的可能远多于「谁先中」。要排名次就抽两次:先抽中奖名单,再在名单内部排序。

600 次投骰能看出什么

六面骰投 600 次,每面期望 100 次——各面次数相加必须等于 600,这条守恒式是判断生成器是否正常的第一道关。真实分布会在 100 上下浮动,某面出现 0 次或 300 次就该怀疑实现。随机数生成器 一次生成一批,正好用来做这类分布观察。

伪随机不等于不可预测

浏览器 Math.random 走的是伪随机算法,种子可被推断,拿到足够多的输出就能预测后续值。密码、会话令牌、抽奖公证这类要求不可预测的场景,要换成 crypto.getRandomValues 或系统级随机源。

这些场合别用它

  • 生成密码与会话令牌:需要密码学安全随机源,普通随机数强度不够
  • 彩票摇号:要第三方公证的随机信标,自建工具说服力不足
  • 涉及资金分配的抽签:随机只是辅助,规则与留痕才是关键

常见问题

抽奖该选可重复还是不可重复
奖品不能重复发出就选不重复;做模拟实验可以允许重复。
结果能复现吗
能,把种子记下来,同种子同序列。
刷新页面结果会变吗
会,每次加载重新取种子。
一次能生成多少条
受浏览器性能限制,几万条一般没问题,更大的量建议用脚本。

相关阅读

要生成密码看 密码生成器怎么选;要唯一标识看 UUID 生成规则;名单合并配 文本去重 一起用。

去使用 随机数生成工具