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 營運的分散式亂數信標,這個組織由多所獨立大學、公司和機構組成,每隔幾秒就發布一個新的可驗證亂數。