- 專欄
文章專區
2021-01-01亂數生成器與線上遊戲Save/Load大法
613 期
Author 作者
高竹嵐/交通大學統計學研究所助理教授,同時也涉獵數學競賽、合唱、音樂劇創作以及桌上遊戲設計等領域。
許多遊戲中都會用到亂數(或稱隨機變數)的設計,像是丟骰子、抽卡或是開槍射擊,再由電腦決定你的命中率,若想模擬電腦的操作,只要打開Excel輸入函數「=rand()」就可以看見一個亂數產生。可是電腦生出來的真的是「亂數」嗎?並不是,其實我們在=rand() 函數中,抽出來的是一種稱為「偽亂數」的東西,是方程式為Xn+1=aXn+c對m取的餘數;只要巧妙地設計方程式中的(a , c , m),電腦就能生出看起來超亂的數字!
「於是你舉起你的槍,把準星對準敵人,準備好一發打爆敵人的頭……『啊!居然沒有命中!』你慘叫了一聲,立刻按下暫停鍵,讀取之前存檔的遊戲紀錄,準備再試一次。這一次,一定會打中!」
……慢著!為什麼你相信第二次的結果,會跟第一次不一樣?
當你沒瞄準好敵人,想暫停遊戲重新讀取之前的遊戲紀錄,再試一次時,為什麼會相信第二次讀取的結果會不同?
圖為第一人稱射擊遊戲(first-person shooter, FPS)《絕地求生-生存賽季9:炙熱巔峰》(PlayerUnknown's Battlegrounds, PUBG)。
(Photo by GHX0819, CC BY-SA4.0, Wikimedia Commons.)
因為電腦在抽亂數
很多電腦遊戲的設計都會使用亂數,或者更學術一點的名詞──隨機變數(random variable)。舉例來說,你很可能要在遊戲中丟骰子、抽牌或開槍,然後再由電腦決定你會不會命中;更廣義一點來說,也就是你經常面對遊戲中有n種可能,它們發生的機率分別是p1, p2,……, pn,而電腦就是依照這個機率決定哪一件事情會發生。例如,如果丟一顆(公正的)骰子,那就會有6個面,一共6種可能,而p1=p2=……=pn=;又如果是遊戲中的開槍射擊,命中率80%,那就是有命中與沒命中2種可能,命中的機率是p1=80%,沒命中的機率則是p2=20%。
你其實可以很簡單的自己模擬電腦怎麼進行這個操作:打開電腦中的Excel程式,隨便點一格,輸入「=rand()」函數,你就會看到那一格出現一個介於0~1之間的數字。而且,如果你再把這個數字複製到其他格裡,數字還會變!是的,這就是電腦在抽亂數,在Excel的函數中是讓0 ~ 1之間的所有數字,以相同的機率出現。
那要怎麼把這個rand()變成開槍命中或是丟骰子呢?讓我們看看前面那個命中率為80%的範例,你可能有注意到rand()會讓介於0 ~ 1的數字以相同的機率出現,換句話說,它有80%的機率會掉出一個小於0.8的數字;這也就是,當你開槍的時候,電腦只要呼叫一個rand(),如果出來的數字小於0.8就判你命中,否則就判你沒命中,這樣就能模擬出命中率80%的效果。……【更多內容請閱讀科學月刊第613期】
當你把骰子丟出去時,電腦只要呼叫一個rand()函數,再做出判定,就可以決定丟出來的數字。(Photo by Erik Mclean on Unsplash)