抽奖要"公平",为什么不能用你想的那个随机数

抽奖要

一、伪随机:看起来乱,其实是算出来的

计算机用的是伪随机数——由算法按固定规则推算,需要先给一个种子值来初始化。种子相同,产出的序列就完全相同。所以它"看起来随机",但本质上是确定的。

常用算法特点
线性同余法实现简单、速度快,随机性一般
梅森旋转算法周期极长、分布均匀,是很多语言默认的伪随机实现

这就是为什么有些抽奖"看起来有规律":种子如果取自当前时间戳,两次点击间隔太近,种子相近,结果就可能相似。

反过来,这也是一个有用的特性:需要复现的实验,只要记住种子,就能重跑出完全一样的结果。科研里这叫"可复现性",不是缺陷。

二、什么时候必须用"密码学安全"的随机

伪随机够用的场景很多,但也有绝对不能凑合的地方:

场景能不能用普通伪随机
游戏里的敌人位置、掉落可以
蒙特卡洛模拟、统计抽样可以(且需要可复现)
生成密码、密钥、验证码不可以,必须用密码学安全的随机源
抽奖、摇号的公平性场景不理想:结果可预测,等于可被操纵

区别在于"可预测性"。密码学安全的随机源(如浏览器提供的加密级随机接口)输出的序列无法从历史结果推断下一个值;普通伪随机做得到,所以它能被"算出来"。

三、五个常见用途,各自的参数怎么设

  • 抽奖号码:设定范围与个数,一次批量生成,注意别用同一个种子连续生成;
  • 随机密码:长度至少 12 位,包含大小写字母、数字与符号;这类场景要用加密级随机;
  • 游戏事件:骰子、随机地图、抽卡系统,普通伪随机足够,但要保证分布均匀;
  • 科学模拟:蒙特卡洛方法建模,需要记录种子以便复现;
  • 日常决策:分组、抽签、排班,用工具生成比"心里数一个"公平得多。

四、公平感从哪来:透明比算法更重要

一个容易被忽略的点:抽奖争议往往不是"算法不够随机",而是"过程不透明"。同样一套随机数,如果参与者能看到范围设定、生成记录、结果可复核,质疑就会少很多。

所以实操建议是:把参数写在明处(范围、个数、是否允许重复),把结果和生成时间一起留档,需要时能重放。技术上这叫可审计,体验上这叫"输得明白"。

一句话收尾:随机数生成的难点从来不是"怎么随机",而是"怎么让人相信它是随机的"。前者是算法问题,后者是设计问题。