林適雨
許多游戲都會設(shè)置抽簽環(huán)節(jié),比如:在大熱手游《陰陽師》里,游戲角色就需要通過抽簽獲得。游戲抽簽的機制和賭博類似,我們每次抽簽,電腦就會生成一個隨機數(shù),這個隨機數(shù)便決定了你抽到的是蝴蝶精還是大天狗(游戲角色)。
除了應(yīng)用在游戲中,隨機數(shù)也被用于安全加密方面。為了保證信息的安全,加密系統(tǒng)不能一直使用同一個密碼,而是使用一些毫無章法的數(shù)字,讓黑客根本無法猜測。
然而,電腦沒有思想,它只能執(zhí)行一些人類(程序員)提前寫好的指令,也就是說,電腦是確定性的。因此,隨機數(shù)并不是真的隨機,那么它們到底是怎么產(chǎn)生的呢?
偽隨機數(shù)
我們生活中最常見的隨機數(shù)被稱為“偽”隨機數(shù),偽隨機數(shù)不是真正的隨機數(shù),只是看上去像是隨機的罷了,這類隨機數(shù)單純由電腦程序決定,即它們的產(chǎn)生服從一些既定的規(guī)則,比如平方取中法和梅森旋轉(zhuǎn)法。
在平方取中法中,我們先給電腦程序定一個四位的起始值(通常被稱為種子),計算種子的平方數(shù),然后提取平方數(shù)中間的四個數(shù)字。例如,種子為3895,它的平方數(shù)為15171025,那么電腦取得的隨機數(shù)就是1710(中間4位)。當程序繼續(xù)進行,1710的平方數(shù)為2924100,那么下一個隨機數(shù)就是9241(不夠八位數(shù),在前面補0)。這樣就能夠產(chǎn)生介于0到9999之間的偽隨機數(shù)。
另外一種產(chǎn)生偽隨機數(shù)的方法是梅森旋轉(zhuǎn)法,使用這種規(guī)則產(chǎn)生的隨機數(shù)需要四個數(shù):m、a、c和種子數(shù)(初始值),計算隨機數(shù)時,我們先用種子數(shù)乘以a加上c,再除以m取余數(shù)。例如,m、a、c和種子數(shù)分別取值7829、378、2310、4321,那么得到的隨機數(shù)就是(4321×378+2310)/7829=208……7216。那偽隨機數(shù)就是余數(shù)7216。當然,這個過程繼續(xù)重復(fù)就會產(chǎn)生一系列的隨機數(shù)。
從上述的兩種規(guī)則中,我們可以看出,一個數(shù)字是由上一個數(shù)字所決定的,如果種子不變,產(chǎn)生的隨機數(shù)序列也不會變,因此,偽隨機數(shù)可以說是完全不隨機的。而且當計算過程重復(fù)得足夠多時,數(shù)列就會陷入循環(huán)之中,僅僅是從表面上看,偽隨機數(shù)也不那么隨機了。比如,使用平方取中法生成的數(shù)列中的一項是2916,那么接下來就是:5030、3009、540、2916,后面不斷重復(fù)。
值得一提的是梅森旋轉(zhuǎn)法的輸入值只有種子數(shù)是可變的,目前90%的游戲都是使用時間作為種子數(shù)的,當你打開抽簽程序開始抽簽,程序就會記錄你按鍵時的時間,比如11點32分43.576836秒,使用小數(shù)點后的三四位68作為種子。一旦種子確定了,后面的隨機數(shù)序列其實就已經(jīng)確定了。因此,當你抽簽老是失敗時,不妨重啟程序,或者換個時間試試。
而m、a、c這三個數(shù)字是由程序員預(yù)先確定好的,它們的數(shù)值已經(jīng)寫在了程序里,它們可以是2位數(shù)也可以是4位數(shù)。對三個數(shù)字的要求是:程序員要提前測試,使得出的隨機數(shù)重復(fù)之前,這個公式必須產(chǎn)生了0到m之間的所有數(shù),而且產(chǎn)生的序列應(yīng)該看起來是隨機的,否則就要重新設(shè)定m、a、c這三個數(shù)字。
真隨機數(shù)也不一定隨機
除了偽隨機數(shù),實際上計算機還可以生成一類“真”隨機數(shù)。
為了生成真隨機數(shù),計算機需要測量某種隨機的物理現(xiàn)象。例如,我們可以測量某一時刻的大氣噪聲(自然界雷暴活動所產(chǎn)生的電磁輻射),測量顯示的數(shù)字就可以輸入電腦,作為一個隨機數(shù)或者被電腦“加工”成一個隨機數(shù)。此時,計算機便引入了自然界的隨機性。
前文中的“時間種子”也是真隨機數(shù),因為人在什么時候按下起始鍵是無法預(yù)測的。不過,由于真隨機數(shù)的生成速度太慢了,所以在生活中,人們很少接觸到真隨機數(shù)。
然而真隨機數(shù)一定隨機嗎?為了搞清這個問題,我們要先明確隨機的定義,即當我們無法預(yù)測某事物,或者某事物并沒有什么明顯的模式時,我們就稱它是隨機的。但某些物理現(xiàn)象其實是確定的,并不是隨機的,因此真隨機數(shù)也不一定隨機。
例如,我們一直認為扔硬幣是隨機性事件,但它本質(zhì)上并不是隨機的,因為如果我們能知道扔硬幣時的初始狀態(tài),即硬幣的受力情況、運動方向和速度等,就可以在硬幣落到地面之前,推測出最終結(jié)果。在我們拋出硬幣的那一刻,它就已經(jīng)是一個確定性事件了。實際上,已經(jīng)有研究者建造出了一個扔硬幣的機器人,這個機器人可以精確控制硬幣的初始狀態(tài),來得到任何研究人員想要的結(jié)果并且萬無一失。
很多時候,事件看起來是隨機的,僅僅是因為我們?nèi)鄙傩畔?,或者預(yù)測的過程太過復(fù)雜。而且有些事件并不是沒有任何模式,有可能我們還沒有找到它的模式。
例如,盡管大氣噪聲非常難預(yù)測,但它仍是一個確定性系統(tǒng)。所有的噪聲都是從某一個地方產(chǎn)生的,如果我們可以找到噪聲產(chǎn)生時的初始狀態(tài),在理論上,我們就可以預(yù)測噪聲的數(shù)值。
量子隨機性
此時,一個問題可能會縈繞在你的腦海中:在我們知道所有的信息的情況下,有什么事情是無法預(yù)測的?答案恐怕只能到量子的世界里尋找了。
如果你還記得薛定諤那只可憐的貓,你應(yīng)該知道:在我們打開盒子前,這只貓同時處于兩種狀態(tài),貓既是死的也是活的。這聽上去像是一個悖論,然而微觀世界的物理規(guī)則確確實實是這樣的。微觀世界粒子的空間分布和動量是完全不確定的(即量子力學的不確定性原理),就像那只貓,如果我們沒有打開盒子,貓仍然同時處于兩種狀態(tài)。只有我們看它,它才有了確定的狀態(tài)。
與經(jīng)典物理學不同,沒有什么其他的信息和計算能讓我們對粒子的狀態(tài)進行預(yù)測。不管是一個特定的放射性原子是否會衰變,還是一個電子的旋轉(zhuǎn)方式,只有在我們看粒子的時候才能知道。
隨著我們掌握的信息越來越多,計算能力越來越強大,我們將有能力預(yù)測出目前無法預(yù)測的隨機性事件,這一事實令我們感到恐慌,不過幸好我們還有量子隨機性。但是如果有一天,我們能夠推翻現(xiàn)在的微觀物理規(guī)則,我們甚至能夠準確地預(yù)測粒子的量子狀態(tài),那么世界將毫無秘密可言,游戲也將毫無樂趣。