話(huà)說(shuō)寫(xiě)一個(gè)抽獎(jiǎng)程序還不容易,不就是生成一個(gè)隨機(jī)數(shù)嗎,哪需什么算法之類(lèi)的。
從技術(shù)上說(shuō),這確實(shí)不難。事實(shí)上,你怎么寫(xiě)都可以,因?yàn)槌绦蛑贿\(yùn)行在特定的設(shè)備上,外人根本無(wú)法了解其中的細(xì)節(jié)。
那么問(wèn)題就來(lái)了,如何才能讓大家相信你沒(méi)有作弊?
你會(huì)說(shuō),我可以把程序開(kāi)源,抽獎(jiǎng)前大家監(jiān)督運(yùn)行。不過(guò)這樣就一定可信了嗎?
就算程序沒(méi)問(wèn)題,也不代表系統(tǒng)就是可靠的?;蛟S你早已偷偷開(kāi)了外掛,這樣無(wú)論程序有多公正,結(jié)果仍躲不出魔掌。
那就退一步吧,每次開(kāi)獎(jiǎng)前重裝一次系統(tǒng)。
不過(guò),假設(shè)所有的軟件都可信,但最終仍需通過(guò)硬件來(lái)執(zhí)行。如果硬件底層就有貓膩,那就根本不可能發(fā)覺(jué)了。
就算硬件也沒(méi)問(wèn)題,最終結(jié)果還得展示給大家吧。如果顯示器就是一個(gè)加了特技的道具,那么一切都白搭了。。。
沒(méi)法玩了。抽獎(jiǎng)本來(lái)就建立在信任的基礎(chǔ)上,存心弄虛作假,那誰(shuí)還玩的贏。
難道就沒(méi)有一個(gè)能讓大家信服的技術(shù)手段,來(lái)解決這個(gè)問(wèn)題嗎?
其實(shí),大家質(zhì)疑的并非是算法,而是運(yùn)行環(huán)境。畢竟,虛擬世界里玄機(jī)太多了。
所以,我們必須放棄自己產(chǎn)生隨機(jī)數(shù)的做法,而是從更客觀的第三方獲取。
宇宙
大自然變幻無(wú)常,充滿(mǎn)各種隨機(jī)性。
微觀的世界更是撲朔迷離,要是使用量子的狀態(tài),來(lái)計(jì)算中獎(jiǎng)號(hào)碼,客觀程度堪比宇宙真理了。
聽(tīng)起來(lái)似乎很理想,但如何才能獲得這些數(shù)據(jù)?只能通過(guò)科學(xué)儀器來(lái)測(cè)量。
然而再精準(zhǔn)的儀器,也得由人來(lái)控制??上覀儾欢?,只能讓科學(xué)家們?nèi)ゲ僮鳌?/p>
這不,又涉及到人這個(gè)環(huán)節(jié)了。只要有好處,磚家想怎么說(shuō)都可以,反正一般人也無(wú)從考證。
就如同觀看宇宙節(jié)目,說(shuō)星星有 10 顆億還是 20 億,有誰(shuí)會(huì)在意?甚至再多報(bào)幾個(gè)數(shù)量級(jí),也少有人質(zhì)疑。
這個(gè)領(lǐng)域的信息,對(duì)常人來(lái)說(shuō)太遙遠(yuǎn)了。即使再客觀,也難以讓人信服。
因此,光有客觀隨機(jī)是遠(yuǎn)遠(yuǎn)不夠的。要讓大家能切身感受到的,才有說(shuō)服力。
天氣
這次,我們選擇一個(gè)貼近生活的因素:天氣。
雖然氣候變化很有規(guī)律,但短時(shí)間里的氣溫,還是具有一定的不可預(yù)測(cè)性。那么就來(lái)嘗試下,使用氣溫來(lái)作為中獎(jiǎng)號(hào)碼吧。
我們選擇開(kāi)獎(jiǎng)當(dāng)天,各大城市的最高氣溫,例如:
北京 12°C,上海 17°C,廣州 24°C,深圳 25°C
于是組合出一串?dāng)?shù)字:12172425,作為開(kāi)獎(jiǎng)的結(jié)果。
當(dāng)然你會(huì)說(shuō),這種組合也太少了吧。況且短時(shí)間內(nèi),氣溫也不會(huì)有很大的變化。如果事先將每個(gè)城市 ± n°C 的組合都買(mǎi)下,豈不是很容易中獎(jiǎng)?
別急,這里只是個(gè)舉個(gè)例子。事實(shí)上,我們得選擇更多的城市,讓組合呈指數(shù)增加。
如果換成 10 個(gè)城市,即使每個(gè)押上 ± 1°C,也有 3^10 = 59,049 種情況了。
如果有 20 個(gè),就有 3^20 ≈ 35 億的組合數(shù)!
不過(guò)問(wèn)題又來(lái)了,中獎(jiǎng)號(hào)碼就那么幾位,如何才能將這一大堆溫度,轉(zhuǎn)換成最終的號(hào)碼?
顯然,這時(shí)不能簡(jiǎn)單的依次排列了。我們必須做一定的舍取,讓每個(gè)數(shù)據(jù)都能參與計(jì)算。例如將它們相乘:
12*17*24*…*30 = xxxxx
得到一個(gè)結(jié)果。不過(guò)這種計(jì)算方式也太弱了,要是一個(gè)城市溫度升高,另一個(gè)降低,也許結(jié)果正好就抵消了。
所以,為了防止被預(yù)測(cè),我們得讓任何一個(gè)數(shù)據(jù)的細(xì)微變化,都能使得結(jié)果變得完全不同。
于是,經(jīng)典的散列算法用在這里再好不過(guò)了吧。
我們照著天氣預(yù)報(bào)的順序,依次算出每個(gè)城市的氣溫散列值:

最后,再整體來(lái)一次散列計(jì)算。將結(jié)果轉(zhuǎn)成數(shù)字進(jìn)行取模,即可得到最終的開(kāi)獎(jiǎng)號(hào)碼了。
Hash(List) % N = xxxxxxx
不像宇宙那么神秘,天氣可隨時(shí)查詢(xún),而且人們能實(shí)時(shí)感受著。算法和數(shù)據(jù)都已公開(kāi),未來(lái)任何時(shí)刻都可以進(jìn)行檢驗(yàn),顯然具有足夠的權(quán)威性。
不過(guò)盡管如此,現(xiàn)實(shí)中我們還是不會(huì)太在意精確度。有誰(shuí)會(huì)為了 1°C 而親自測(cè)量,況且,同個(gè)城市不同的時(shí)間和環(huán)境,仍有一些偏差。
如果彩票開(kāi)獎(jiǎng)用上天氣數(shù)據(jù)的話(huà),CCTV 最后一個(gè)可信節(jié)目也將面臨消失吧:)
金融
思考下本質(zhì)問(wèn)題,抽獎(jiǎng)目的是什么?不就是為了錢(qián)嗎。
同樣是錢(qián),世界級(jí)的金融機(jī)構(gòu),顯然有著更完善的體系,為何不采用它們的數(shù)據(jù)呢?