大賞驗證器
大賞由一組隨機產生的token與該商品大賞數量與總籤數產生,確保公平性,於全部大賞開出後公布token值,供會員驗證大賞分布真實性,確保中途不會被有心人修改,做到完全公正公開
大賞產生器-程式碼(可自行驗證)
public function getWinningNumbers($token, $N, $K) {
// 將 token 轉換為整數種子
$seed = crc32($token);
// 初始化隨機樹產生器
mt_srand($seed);
// 生成部重複大獎號碼
$winning_numbers = [];
while (count($winning_numbers) < $K) {
$number = mt_rand(1, $N);
if (!in_array($number, $winning_numbers)) {
$winning_numbers[] = $number;
}
}
//號碼排序呈現
sort($winning_numbers);
return $winning_numbers;
}
大獎驗證-優點與特色說明
我們設計的大獎驗證器旨在確保抽獎過程的公平性和不可篡改性,藉由公開的算法和可驗證的隨機種子(token),讓會員能自行驗證大獎號碼的生成過程,增強對平台的信任。
隨機種子生成:抽獎時使用一個隨機產生的 token,該 token 結合商品的大獎數量和總籤數,作為隨機數生成器的種子。在全部大獎開出後,token 會被公開,供會員驗證。這確保了抽獎的不可預測性和公平性。
可靠的隨機數生成器:使用 PHP 的 mt_rand() 函數,經過 mt_srand($seed) 初始化,能夠在給定種子的情況下,生成一致的隨機序列。這意味著在相同的 token、總籤數 N 和大獎數量 K 下,生成的號碼是可重現的。
唯一性保障:程式確保生成的每個大獎號碼都是唯一的。透過檢查新生成的號碼是否已存在於 $winning_numbers 陣列中,避免了重複號碼的出現。
結果可驗證性:所有用於生成大獎號碼的參數(token、N、K)和算法都是公開的。會員可以自行執行程式碼,驗證系統公布的結果,確保沒有任何篡改。
透明度:在全部大獎開出後公開 token,並提供生成大獎號碼的程式碼,增加了抽獎過程的透明度,讓會員對結果更加信服。
假設舉例
假設某商品的總籤數為 N = 1000,大獎數量為 K = 5。在抽獎開始前,系統隨機生成了一個 token,例如 'a1b2c3d4e5f6',但在大獎都已抽出前不公開。
當所有大獎都已抽出後,系統公布了 token 值 'a1b2c3d4e5f6'。會員可使用上述程式碼,輸入 token、N 和 K,執行 getWinningNumbers() 函數,得到大獎號碼列表。例如,生成的大獎號碼為 [123, 456, 789, 890, 999]
會員可以將自己的籤號與這些大獎號碼比對,確認是否中獎。同時,由於程式碼和 token 都是公開的,會員可以驗證系統公布的結果是否真實,確保沒有被篡改。
公平性與不可篡改性
公平性:每個籤號在抽獎時都有相同的機會被選為大獎號碼。隨機種子基於未知的 token,在抽獎過程中無法預測,確保了結果的隨機性。
不可篡改性:由於抽獎結果是根據公開的算法和 token 生成的,任何在抽獎後的篡改都會被會員自行驗證時發現,杜絕了不當操作的可能。
優點總結
透明公開:公開 token 和算法,讓會員能自行驗證,增強了系統的透明度
防止作弊:不可預測的隨機種子和公開驗證機制,防止了內外部人員作弊的可能。
增強信任:會員可以親自驗證抽獎結果,增加了對平台的信任度。
簡單易用:程式碼簡潔明了,會員可輕易使用並理解抽獎過程。
結論
我們的大獎驗證器通過公開的隨機種子和算法,確保了抽獎過程的公平性和不可篡改性。會員可以自行驗證抽獎結果,充分保障了自身權益,同時也提升了對平台的信任和參與意願。