fixmint
ZH-TW

如何公平抽出抽獎得主,並讓過程可供檢查

作者: · · 更新於 2026年11月8日 · 閱讀約 4 分鐘

要公平地抽出得主,請使用為安全性設計的產生器,讓每個參加項目的機會相同,並讓大家事後能檢查結果。簡單抽選器的不公平,通常來自兩個地方:隨機來源不夠強,或是一個小小的算術錯誤,稱為模數偏差(modulo bias)。兩者都可以修正。公開參加名單與抽獎紀錄,是證明沒有人操控結果的最佳證據。

隨機抽籤器公平抽出得獎者免費使用

真隨機與偽隨機

真隨機來源的不可預測性,來自電子雜訊等物理過程。偽隨機產生器則是一套公式,它從種子(seed)開始,依固定步驟運算,產生看似隨機的數列。這個數列完全由種子決定,因此只要知道種子和公式,就能預測每一個數字。

大多數軟體使用偽隨機產生器,用來隨機排列播放清單或產生遊戲關卡都沒有問題。但如果抽選牽涉獎品,重點在於是否有人能預測或影響結果。速度快卻可預測的產生器,就是錯誤的工具。

使用瀏覽器的密碼學產生器

在 JavaScript 中,Math.random() 是一種快速的偽隨機產生器。它的文件明確指出不適用於密碼學,而抽獎正是需要安全性的情境。Web Crypto 的函式 crypto.getRandomValues() 會把陣列填入來自作業系統密碼學隨機來源的數值,這才是應該使用的方法。隨機抽選器 每次抽選都使用它,包括擲硬幣和擲骰子。工具若不說明自己用的是什麼來源,就比較難讓人信任,所以在依賴它之前,請先確認。

模數偏差,舉例說明

假設你的來源會產生一個隨機位元組,也就是 0 到 255 之間的整數,而你要從三個參加項目中抽出一個。最直接的做法是把它除以 3 取餘數。看起來公平,但 256 無法平均分成三組。

  • 餘數為 0 的數值,也就是 0、3、6 一路到 255,共有 86 個。
  • 餘數為 1 的數值有 85 個,餘數為 2 的數值也有 85 個。

因此在 256 次中,參加項目 0 會出現 86 次,約 33.6%;參加項目 1 和 2 則各出現 85 次,約 33.2%。差距雖然不大,卻確實存在,而且當參加項目數量相對於來源範圍變大時,差距也會擴大。

解法是拒絕抽樣(rejection sampling)。先抽出一個數值,如果它落在不平均的剩餘範圍內,就重新抽。以上面的位元組為例,要拒絕 255,只接受 0 到 254,因為這個範圍可以平均分成三組。若使用 32 位元的隨機數,剩餘部分大約每 43 億個數值才有一個,對抽獎來說偏差可以忽略。不過,謹慎的抽選器仍會處理這個問題,因為同樣的錯誤在範圍縮小時會變得更嚴重。

不重複的抽選

如果需要抽出多位得主,連續三次抽取隨機索引,可能會抽中同一個參加項目兩次。以下兩種做法可以避免這個問題:

  1. 每抽中一位得主,就把他從名單移除,再從其餘的人中抽取。
  2. 用 Fisher–Yates 方法把整份名單洗牌一次,然後從最前面取出得主。

Fisher–Yates 會從名單末端往前走,把每個位置與它自己或前面某個隨機選出的位置交換。只要隨機選擇是公平的,它就能讓每種排列出現的機率相同。這個方法簡短、廣為人知,也容易向參加者說明。抽選器的「抽中後移除得主」與「不重複」選項,就是對應這兩種做法。

讓抽獎可以被檢查

公平的抽獎,是任何人都能驗證的抽獎。抽獎前請:

  • 把參加項目以編號清單公開,並附上參加資格的規則。
  • 公開該清單的 SHA-256 指紋。任何 SHA-256 工具都能產生,例如 雜湊產生器。只要一個參加項目改變,指紋就會完全不同,因此清單無法在事後被悄悄修改。同樣的檢查也能用來確認下載的檔案,如何檢查下載檔案的 SHA-256 校驗碼 說明了步驟。

抽獎期間與結束後請:

  • 從開始使用抽選器到顯示結果為止,全程錄下畫面。
  • 公開最終名單和中獎編號,讓大家能重新計算指紋,確認內容沒有變動。
  • 說明得主是如何選出的,例如「使用瀏覽器中的抽選器,並採用作業系統的密碼學隨機來源」。

各平台的抽獎規則不盡相同,抽獎也可能因你所在的地區而有法律要求。舉辦前請先查看平台的推廣規則,並了解當地法律。以上只是一般性的指引,不構成法律建議。準備好之後,就可以使用隨機抽選器抽出得主。

如何在 fixmint 上操作

  1. 選擇 名稱,然後把參加項目貼到 名稱,每行一筆。
  2. 把 得主人數 設為獎品數量。勾選 抽中後從名單移除得主,確保沒有人能中獎兩次。
  3. 若要進行編號抽選,請選擇 數字,設定 最小 與 最大 的值。如果每個號碼只能中獎一次,請勾選 不重複。
  4. 在錄影已從一開始就進行的情況下,按下 抽出得主。
  5. 公開編號的參加項目、SHA-256 指紋、中獎項目,以及抽選器的使用方式。

快速解答

用 Math.random() 抽獎可以嗎?

遊戲或洗牌用它沒有問題,但對於會被檢查的抽獎就不適合,因為它的輸出可以被預測。請改用密碼學來源。

為什麼不直接把隨機數除以參加項目數取餘數?

當範圍無法平均分配時,餘數就會不平均,導致某些項目的中獎機率稍高。拒絕抽樣可以消除這種偏差。

同一次抽獎可以抽出多位得主嗎?

可以。每抽出一位就先移除,再進行下一次抽選;或者只洗牌一次,然後取前幾個項目。無論哪種方式,都不會有項目中獎兩次。

借助 AI 協助,由英文原文翻譯而成。

留言

    還沒有留言,搶先留言吧。

    您的評分(選填)

    您的電子郵件不會顯示,也不會被保存。

    The Paperoom Game Night Kit 的封面The Paperoom Game Night Kit

    52 頁可列印的遊戲之夜素材:派對賓果、解謎、桌遊與紙筆對戰,另附規劃表與計分表。

    $7.00在 Gumroad 購買英文版