著名視頻網站 B 站抽獎,十個獲獎者裡面可能只有 1 個不是大會員,王思聰發起的抽獎 100 個獲獎者裡面可能只有一個不是美女,連最基本的性別都無法做到公平。那麼該如何實現一個公平的抽獎呢?
作為一個絕對的中獎絕緣體,為了知道為什麼抽不中自己,也花了一定的時間學習抽獎的原理。發現實現一個公平公正的抽獎其實並不容易。
網絡直播抽獎往往採用刷屏截圖的方式,能調動活躍的氣氛,但並不能實現抽獎結果複現;也有一些博主採用確定抽獎範圍排序 + 隨機數的方式,比如 100 個人裡面抽一個就將一百人進行一定方式的排序,再生成一個 0-100 的隨機數,認為這個數所對應的人就是獲獎者,可是這樣也沒有辦法確定隨機數是否真的隨機,無法確定隨機數的生成方式,參與者更無法驗證抽獎是否真實,就算發起方發一個截圖,也無法證明抽獎的公平性。
使用隨機數可以確保每個參與者在抽獎中具有相同的機會。每個參與者的選項都是等價的,而且每個選項都有相同的機會被選中。使用隨機數可以確保這種公平性。
同時,使用隨機數可以增加抽獎的趣味性和刺激性。每個參與者都不知道自己是否會被選中,這增加了抽獎的刺激性和懸念感。
在抽獎過程中,為了確保隨機性,需要使用高質量的隨機數生成器。一個好的隨機數生成器應該是無偏的、獨立的、均勻的和具有周期性的。如果生成的隨機數不是高質量的,可能會導致抽獎結果不公平或預測可能性很高。
我們都知道,計算機是無法生成真正的隨機數,所有計算機隨機數均為偽隨機。於是我採用某個確定時間節點之後的第一個比特幣區塊的塊頭哈希值作為隨機數,我無法挖礦也就無法生成塊頭,更不可能操控隨機數生成的結果。抽獎的基本算法採用哈希算法
下面是實現的具體過程:
1. 將參與者的 ID 統計出來
2. 確定固定時間,比如東八區 2023 年 4 月 22 日 13:00,取此時間以後的第一個比特幣區塊塊頭哈希值為隨機數
3. 將每個人的 ID 分別於此隨機數一起取哈希值
4. 把求得的哈希值排序,根據中獎人數確定前幾名為獲獎者
我並不會寫代碼,因此我讓 ChatGPT 幫我編寫了此代碼
簡單安裝完所需要的庫以後就可以執行了,參與者 ID 可以是 B 站 UID,也可以是手機號,還可以直接是人名,下面我用 QQ 號做演示。將用到下面兩個網站把群友的 QQ 號導出
導出以後就得到了這一個全部由 QQ 號組成的.txt 文本。然後根據確定時間打開區塊鏈瀏覽器,找到所需要的區塊的塊頭哈希值。把此哈希值和.txt 文檔名填入上面的程序之中,最後運行此程序,第一名即為獲獎者。
所用到的程序我將會開源,並在評論區發出