參與抽簽的總?cè)藬?shù)NUM = 441,通過以下流程抽取25名幸運(yùn)同學(xué):
- 獲取2019年5月4日開盤時(shí)(北京時(shí)間5月4日 9:30pm)的納斯達(dá)克指數(shù)N1,道瓊斯指數(shù)N2
- 取N1*N2的前5位數(shù),并將其轉(zhuǎn)化為字符串Skey
- for k = 1:25
將Skey與k合并為新的字符串Skey',對Skey'進(jìn)行一次SHA1運(yùn)算,得到幸運(yùn)數(shù)字lucky
獲獎(jiǎng)編號 = mod(lukcy,NUM)
抽獎(jiǎng)結(jié)果于5月4日晚11點(diǎn)前公布
說明: 由于兩個(gè)股票指數(shù)無法精準(zhǔn)預(yù)測,而由于SHA1運(yùn)算對輸入的敏感特性,導(dǎo)致幸運(yùn)數(shù)字lucky是不可預(yù)測的!因此,以上算法保證了抽簽的公平性。此外,當(dāng)股票指數(shù)公布后,任何同學(xué)都可以根據(jù)以下源碼重復(fù)進(jìn)行抽簽,抽簽的流程是完全公開的。
### 抽簽代碼
from googlefinance.get import get_code
from hashlib import sha1
NUM = 441
NASDAQ = #2019年5月4日納斯達(dá)克開盤指數(shù) https://finance.yahoo.com/quote/%5EIXIC/
DJI = #2019年5月4日道瓊斯開盤指數(shù) https://finance.yahoo.com/quote/%5EDJI?p=^DJI
Skey = (str(NASDAQ*DJI))[0:5]
for k in range(25):
luckeyNum = sha1((Skey + str(k)).encode())
luckeyNum = int(luckeyNum.hexdigest(),16)
TheChosenOne = luckeyNum%NUM
print('恭喜第{0}位同學(xué)入選!'.format(TheChosenOne))
再次說明:有些同學(xué)不理解為什么要搞這么復(fù)雜的抽簽,直接隨機(jī)數(shù)不就了事了嘛。然而,隨機(jī)數(shù)的弊端是無法證明是否是黑箱操作。以上方法通過不可預(yù)知的股票指數(shù),以及算法上的可重復(fù)可驗(yàn)證性,從技術(shù)上杜絕了黑箱操作。
結(jié)果公布:NASDAQ = 8092.88 DJI = 26379.14,代入以上程序,得到以下幸運(yùn)同學(xué)名單:

image.png