如何公平抽取抽奖获奖者,并展示抽选过程
要公平地选出获奖者,就要使用为安全设计的生成器,让每个参与者的中奖机会相同,并允许大家事后核对结果。简单抽选工具的不公平,大多源于两个地方:随机源太弱,或者一个叫做取模偏差的小算术错误。两者都是可以修复的。公开参与名单并保存抽选记录,是证明没有人能操控获奖者的最好依据。
随机抽取公平地抽出获胜者免费使用真随机与伪随机
真随机源的不可预测性来自物理过程,例如电子噪声。伪随机生成器则是一套公式。它从一个种子开始,按确定的步骤运算,产生看起来随机的数列。这个数列完全由种子决定,所以只要知道种子和公式,就能预测每一个数字。
大多数软件使用伪随机生成器,用来打乱播放列表或随机生成游戏关卡,完全没有问题。但对于有奖品的抽选,关键问题是有没有人可能预测或影响结果。速度快却可以预测的生成器,并不适合这种场合。
使用浏览器的密码学生成器
在 JavaScript 中,Math.random() 是一个速度很快的伪随机生成器。它的文档也说明,它不适合用于密码学。而奖品抽选属于对安全性敏感的场景。Web Crypto 提供的 crypto.getRandomValues() 会用操作系统的密码学随机源填充数组,应当使用它。随机抽选工具每次抽选都使用它,包括抛硬币和掷骰子。如果一个工具没有说明自己使用什么随机源,就很难让人信任,所以在依赖它之前先问清楚。
取模偏差,举个例子
假设你的随机源给出一个随机字节,即 0 到 255 之间的整数,而你要从三个参与者中选一个。最简单的做法是把它除以 3 取余数。这看上去很公平,但 256 无法被 3 整除。
- 0、3、6 等一直到 255 的数,余数为 0。这样的数共有 86 个。
- 余数为 1 的数有 85 个,余数为 2 的数也有 85 个。
因此,在 256 个数中,参与者 0 出现的概率是 86/256,约为 33.6%,而参与者 1 和 2 各出现 85 次,约为 33.2%。差距虽小,却是真实存在的。当参与者数量相对于随机源的范围变大时,这种偏差也会随之增大。
解决办法是拒绝采样。抽取一个数,如果它落在不均匀的剩余部分,就重新抽取。以字节为例,你要舍弃 255,只接受 0 到 254,因为这些数可以被 3 整除。若使用 32 位随机数,剩余部分只占约四十三亿分之一,对于抽奖来说偏差可以忽略。不过严谨的抽选工具仍然会处理这一问题,因为同样的错误在范围缩小时会变得更严重。
不重复的抽选
如果需要抽出多名获奖者,连续三次抽取随机索引,可能会抽到同一个参与者两次。两种简洁的方法可以避免这一点:
- 每抽出一名获奖者,就把他从名单中移除,然后在剩下的人中再抽。
- 用 Fisher–Yates 洗牌法把整个名单打乱一次,然后从顶部依次取出获奖者。
Fisher–Yates 从名单末尾开始,把每个位置与它当前位置或之前某个随机选中的位置交换。只要随机选择是公平的,它就能让每种排列出现的概率相等。这种方法简短、广为人知,也容易向参与者解释。工具中的“移除获奖者”和“不重复”选项,分别对应这两种方法。
让抽选可以核对
公平的抽选,是任何人都能验证的抽选。抽选前:
- 将参与者列为编号名单,并公布谁有资格参与的规则。
- 公布该名单的 SHA-256 指纹。任何 SHA-256 工具都可以生成,例如哈希生成器。只要名单中有一个条目改变,指纹就会完全不同,因此名单事后无法被悄悄修改。同样的核对方法也适用于下载文件,如何核对下载文件的 SHA-256 校验值中有具体步骤。
抽选过程中和抽选结束后:
- 从开始使用抽选工具,到显示结果,全程录屏。
- 公布附有获奖编号的最终名单,方便大家重新计算指纹,确认名单没有被改动。
- 说明获奖者是如何选出的,例如“使用基于浏览器的抽选工具,该工具采用操作系统的密码学随机源”。
不同平台的抽奖规则各不相同,而奖品抽选还可能受到所在地法律的约束。开展活动前,请查看平台的促销规则,并了解当地法律。本文仅提供一般性指导,不构成法律建议。准备好之后,就可以用随机抽选工具选出获奖者。
在 fixmint 中的操作方法
- 选择名称,然后将参与者粘贴到名称,每行一个中。
- 将获奖人数设为奖品数量。勾选从名单中移除获奖者,确保同一个人不会中两次。
- 如果要进行编号抽选,选择数字,设置最小值和最大值。如果每个号码只能中一次,勾选不重复。
- 点击抽选获奖者,并从一开始就保持录屏运行。
- 公布编号名单、SHA-256 指纹、获奖参与者,以及抽选工具的使用方式。
快速解答
Math.random() 适合用于抽奖吗?
适合用于游戏和洗牌,但不适合用于会被核对的抽奖,因为它的输出可以被预测。应当使用密码学随机源。
为什么不直接把随机数对参与者人数取模?
当范围不能被整除时,余数的分布就不均匀,某些参与者会稍微更容易中奖。拒绝采样可以消除这种偏差。
一次抽选能选出多名获奖者吗?
可以。每次抽出一名后将其移除再抽下一位,或者先打乱一次然后取前几名。无论哪种方式,都不会让同一个参与者中两次。
由 AI 辅助翻译自英文原文。
评论
还没有评论。快来抢沙发。


