人们实际上拿随机数做什么
六个类别覆盖了几乎所有真实需求,而它们需要不同类型的随机性。
六个类别
| 用途 | 典型区间 | 是否允许重复 |
|---|---|---|
| 公平抽奖 | 1 到参与人数 | 不允许 |
| 抽查复核 | 1 到记录条数 | 不允许 |
| 游戏机制 | 骰子、d20、纸牌 | 取决于骰子 |
| 测试数据 | 任意区间或长度 | 都行,通常允许 |
| 任务或座位分配 | 1 到人数 | 不允许 |
| 决策与打破平局 | 1 到选项数 | 不适用 |
不放回抽样是最常被做错的那个
一个一个抽出中奖者、撞上重复就重抽,是手工做法,它有两个问题:白白浪费抽取次数,而且即使过程真的公平,看上去也显得随意。不放回抽样——也就是部分洗牌——既正确,也更容易向人解释。
这个区别还改变了数学。放回时每次抽取概率相同。不放回时池子在缩小,所以每抽一次概率都会变化。
哪里不该用随机
任何需要可复现的东西:必须在多次运行之间保持一致的测试夹具、必须对同一个用户稳定的 A/B 分组,或者确定性的模拟。这些场合你需要的是一个带种子的生成器,而不是真正的随机——相同的种子会复现相同的序列。
而任何与安全相关的东西,都该用密码学随机源,而不是一个图方便的网页。抽奖用的随机数和生成令牌用的随机数看起来一模一样,对随机性的要求却正好相反。
常见问题
抽签和随机选一个有什么区别?
抽签通常意味着有顺序且不重复;选一个意味着一次独立选择。要产生多个中奖者时,你需要的是抽签行为。
随机数生成器能用来抽奖吗?
休闲性质的可以。任何有法律效力的场合,请在抽取前记录方法和参与名单,并保留带顺序的结果。
测试数据该用随机还是带种子?
如果测试依赖它,就用带种子的。每次运行都变的随机值会让失败难以复现。