Spinvolta

公平性原理

先随机,后动画。关键时刻可核验。

1. 每个结果都来自密码学随机数生成器

Spinvolta 使用 crypto.getRandomValues() 抽取结果——这是每个现代浏览器和操作系统内置的密码学安全随机数生成器,也是生成加密密钥所用的随机源。我们从不用 Math.random() 来决定任何事情。(纯装饰性的东西,比如彩纸往哪飞,可以用它。)

2. 没有取模偏差

一个 32 位随机数不一定能平均分给比如 7 个选项:4,294,967,296 不是 7 的倍数,所以朴素的 number % 7 会让某些选项的概率略高一点。Spinvolta 使用拒绝采样:如果数字落在范围顶端无法均分的余数区间,就丢掉重抽。这样无论有多少个选项,每个选项的概率都完全相同。

3. 权重是精确的

在加权模式中,1、2.5、0.125 这样的权重会换算成同一刻度上的整数并精确相加。对总和做一次均匀抽取来决定结果,所以权重 2 的选项概率恰好是权重 1 的两倍——转盘上的格子大小显示的就是这个精确概率。

4. 多人中选不重复

多人中选、分组、随机排序、洗牌和抽奖都使用无偏的 Fisher–Yates 洗牌(同样带拒绝采样),所以每一种可能的顺序或中选组合概率都相同。

5. 先出结果,后播动画

你点“转一下”时,结果在转盘动起来之前就已决定。随后求解器计算一段运动——蓄力、速度、圈数、最后的轻微晃动——让转盘恰好停在中选格内、离边缘有一段距离的随机位置。拨得更用力、转得更久或手动停止,都只改变外观。我们的自动化测试会检查上千次随机转动,确保动画总是停在事先抽出的结果上,绝不会滑到相邻格子。

6. 抽奖和房间的可证明公平抽取

对于抽奖(以及任何需要信任的抽取),Spinvolta 再进一步,让你不必信任我们或主持人:

  1. 开奖前,你的浏览器锁定参与名单和设置,并公布指纹——名单、设置和一个秘密种子的 SHA-256 哈希。我们的服务器记录收到它的时间。
  2. 指纹中指定 drand League of Entropy 随机信标未来的某一轮——这是由世界各地独立机构每 3 秒生成一次的公开值,没有人能预测或挑选。
  3. 该轮公布后,由指纹、信标值和种子计算出中奖者。
  4. 证明页展示一切。任何人都可以点核验,在自己的浏览器里重新计算,包括检查信标的密码学签名。

主持人无法挑选中奖者,因为名单锁定时信标值还不存在。我们也做不到,因为在指纹锁定前我们看不到种子,而且我们不控制 drand。如果无法连接信标,开奖会改用明确标注的承诺—揭示方式。

7. 经过统计检验

每次改动,我们的测试套件都会对数十万次模拟抽取做卡方拟合优度检验,完整测试则超过一百万次:均匀抽取、加权抽取、洗牌以及多人中选的每个位置。你可以在公平性测试页面亲自跑一遍。

我们无法证明的部分

日常转动时,你需要相信浏览器里运行的代码就是我们描述的代码。代码完全在你的设备上运行,你可以用浏览器开发者工具查看。若事关重大——奖品、公开抽奖——请使用可证明公平的抽取,它不需要信任任何人。

常见问题

转盘能被操纵吗?

动画做不到:结果先被公平抽出,运动只是把它展示出来。唯一能改变概率的是加权模式,此时会显示“加权转盘”标识,并按概率绘制格子大小。

为什么同一个名字连续出现两次?

因为真正的随机就会有连续。10 个选项时,同一个选项连续出现两次的概率是 10%。想每项只出现一次,请用淘汰模式。

drand 是什么?

drand 是由 League of Entropy 运营的分布式随机信标,该组织由多所独立大学、公司和机构组成,每隔几秒就发布一个新的可核验随机值。