抽獎活動中的學習

《神祕的程序員們》年度大抽獎,其中的抽獎算法頗有意思。

抽獎算法:1、2、三等和喵喵獎 將按照以下規則及算法抽取:git

  1. 選取 2016/11/01 11.00 am 以後產生的第一個bitcoin block程序員

  2. 順序使用這個block中包含的Transactions決定全部中獎者github

  3. 方法:拿出第一個Transaction Hash好比 fc927205f394d537b17b9d0db45aa1388c63dfbf8be9c2b3e5c8dd6696f7cee7 字符串拼接 總獎券數量,好比 119394 張,取sha1("fc927205f394d537b17b9d0db45aa1388c63dfbf8be9c2b3e5c8dd6696f7cee7119394"),把結果轉成integer:752844761200031861206594954675289876476750084715 ,和總獎券數量 119394 取模。得出的數字 57479 + 起始號碼1000000 = 1057479 第一個中獎號碼。算法

  4. 重複以上過程,直到抽出全部中獎者。若是有重複號碼,就跳過它,取下一個Transaction Hash。3d

  5. 若是當前block全部Transactions都用完了,尚未抽取出足夠的中獎者,就繼續使用下一個block,方法不變。code

  6. 咱們會在全部獎券發送截至以後,上傳獎券信息到github供你們查看。爲了保護用戶隱私,咱們會隱去我的信息,上傳格式爲:獎券號碼,發放時間,sha1。用戶能夠經過這個算法校驗本身/以及其餘朋友的獎券是否符合這個規則。字符串

  7. 若是10天內沒有成功聯繫到該獲獎者,將會使用原號碼+1替代做爲新的獲獎者。如此類推。get

  抽獎的計算代碼已開源,https://github.com/planetcoder/readerLotteryhash

  這段代碼利用bitcoin的隨機性產生抽獎活動的中獎號碼。it

使用方法:

  1. 在 https://blockexplorer.com 選取某個時刻的 BlockHash (具體使用哪一個時刻根據抽獎活動規則肯定)
  2. 運行腳本 ./lotteryResult.py blockhash number total startnum

參數說明:

  • blockhash 某個時刻的BlockHash
  • number 總共中獎人數,好比50個
  • total 所有發出的獎券數量,好比 59391 張
  • startnum 獎券號碼起始值,爲了獎券號碼好看,通常用一個比較大的數值作爲開始,咱們通常採用 1000000

例子:

./lotteryResult.py 000000000000000003eaa089e640ea339a4f5c83721a607c1075d3443a834e84 50 59391 1000000

result 0 is 1026155
result 1 is 1055107
result 2 is 1056394
result 3 is 1010464
result 4 is 1047703
result 5 is 1033045
......

以上號碼即爲各中獎結果

相關文章
相關標籤/搜索