從非洲邁向歐洲——了解Dota2中的偽隨機機制
原文鏈接(含在線可運行代碼): 從非洲邁向歐洲——了解Dota2中的偽隨機機制 - 集智專欄
作者:朝陽(其實人在海淀)
很多遊戲愛好者應該已經知道了,目前的很多涉及到概率問題的視頻遊戲中,遊戲系統所採用的隨機判定方法與實際是不相符的。用專業一點的話來講,就是遊戲中一些隨機事件的概率分布與其應當遵循的概率分布(大部分情況下是幾何分布)不同——我們把這種概率分布叫做偽隨機分布(The Pseudo-random distribution,簡稱PRD)。
雖然同樣含有「偽隨機」(Pseudo-random)這個名字,但是偽隨機分布這個概念與信息技術領域所用的「偽隨機數生成器」是有區別的——後者試圖使用某些技術手段給出符合需要的隨機數列,而前者只是在應用隨機事件的時候額外加入的一個演算法。
「偽隨機分布」簡單來說,就是把人們在賭博遊戲中常有的「事不過三」這種心態變成了現實——也就是說,在這種概率分布下,如果一個事件多次未發生,則它下一次發生的概率會變大。DOTA2 Wiki給出了一個專頁說明了這個系統的內容(同樣,DOTA2 Wiki也對護甲計算方法、各類特性疊加等涉及到演算法的遊戲系統均給出了詳盡的說明),下面讓我們來簡單地學習一個。
用數學語言來講,DOTA2所使用的PRD遵循這樣一個函數:
其中,P(N)表示僅當第N次嘗試時事件發生的概率(意味著前N-1次嘗試均未成功),C表示一個小於1的常數。
這個函數表達的意義就是,從某個時刻開始,如果某次事件未發生,則它在下一次嘗試中發生的概率會增加一個固定值;而當某次事件發生後,下一次嘗試中發生的概率又會降到最低值。舉個例子,斧王的反擊螺旋在第一次攻擊時效果發生的概率是5.6%(C=0.05570),如果這次攻擊未發生,則它下一次發生的概率會變為11.2%,一直如此增加下去,需要注意的是,如果重擊效果連續17次未發生,那末下一次發生的概率將會大於100%(事實上僅僅是計算數值大於1,概率的數值不可能大於1),也就是說重擊一定會發生。
上述函數中的C值(也就是例子中的0.056)不是隨便取的,是根據需要符合的期望值來獲得的。我們可以使用程序計算一下此時發生重擊的期望:
(代碼略,見原文)
根據遊戲里的數據,斧王反擊螺旋的概率是20%。而眾所周知,對於一個單次發生概率為20%的事件,其期望是5(幾何分布的期望是單次檢驗概率P的倒數),這與PRD的期望是一致的。也就是說,PRD並未改變原有隨機過程的概率,而僅僅改變了該隨機過程的分布狀況。
大家很明顯地可以看出,對於PRD而言,C值是非常關鍵的一個數據,而且很顯然的,這個C值與原有的單次事件發生概率P有一一對應的關係。通過傳統的方法來獲取C值並不容易,對於常用的一些概率P,我們可以通過查表來獲得它們所對應的C值。
而利用計算機程序,我們便可以通過中值逼近方法來計算出任意一個P值所對應的C,具體做法是將上面的程序包裝成一個函數,然後不斷拿猜測的C值去嘗試得到一個新值,如果新值非常接近於P,則認為我們找到了所需的C值。(代碼略,見原文)
大家可以自己改變程序第一行的P的賦值,來看看得到的C值與上表中是否接近。
大家也許會問,為什麼要在視頻遊戲里使用PRD系統呢?我們不妨先繪製出PRD隨機分布與正常隨機分布(幾何分布)的圖像,來觀察二者有何差異:
上圖中,藍柱表示正常隨機過程(幾何分布)的分布情況,而紅柱表示PRD的分布情況。從圖中可以看出,相對於幾何分布,PRD的分布曲線更為均勻,而且分布狀況接近於正態分布,這種分布狀況正好反映了在視頻遊戲中採用PRD這一系統的兩個理由:
其一,防止某些小概率事件連續發生。在遊戲中,比如某些抽獎、暴擊、閃避等效果頻繁連續發生會一定程度上影響遊戲平衡性,而作為競技遊戲而言,某次小概率事件的集中發生很可能影響比賽形勢。歷史上的一次DotA比賽中,當時折射技能還是按固定概率全部反彈的幽鬼實現了一次殘血反殺三人的壯舉,靠得就是連續幾次的折射觸發。這一次戰鬥的獲勝很大程度上影響了比賽走勢——而這對於競技項目是不合理的,因為比賽結果不應當由運氣所決定(事實上,之後幽鬼的技能很快就被修改)。而PRD就能很好地減少這種情況出現的可能性。比如說,大魚人斯拉達連續打出兩次重擊的概率在一般概率分布下為6%左右,而在PRD下這一概率僅為0.6%;
(視頻不支持,見原文)
其二,防止某些事件長時間不發生。某些事件的嘗試次數超過期望值很多倍仍不發生的這種現象在真實世界中很常見(比如說全球男女比例差不多可是你就是沒有女朋友),但是在遊戲世界中不免讓人惱火。在PRD中,任何事件都能保證在有限次嘗試中發生,這對於遊戲是有積極意義的(這也是為什麼遊戲世界看上去比現實更加幸福的原因之一)。
DOTA2所採用的PRD這一系統是來源於Warcraft III的。事實上,在DOTA2的早期,開發人員摒棄了War3的諸多系統和演算法,但是玩家反映這樣的遊戲很難適應並會出現一些令人不快的問題,於是後來DOTA2的絕大部分遊戲系統均與War3 DotA一致——甚至包含一些War3固有的問題。比如PRD中某些大概率事件的實際期望值相較於一般概率分布的期望值是不同的(貌似是暴雪的程序猿算錯了),它們更低一點(比如先鋒盾實際的抵擋概率是66.7%而並不是標稱的80%)。
在DOTA2中,大部分的暴擊、擊暈和格擋都遵循PRD,但是也有少部分例外——比如碎顱錘的重擊(擁有一個內置CD以防止連續觸發),以及舊版虛空假面的回到過去(這一神級閃避技能不僅可以閃避任何傷害,同時遵循幾何分布,也就是說連續幾次觸發技能從而完成死血逃生的可能性並不低)。對了,最靠人品的英雄——食人魔法師的技能並不遵守PRD,也就是說連續多次打出4倍技能的可能性是很大的,當然,也有可能整場比賽沒有一次4倍暴擊。
了解這一系統有什麼意義么?其實並沒有什麼特別的作用,只是我們據此可以了解到我們並不會不幸到一場遊戲打不出一次紅字,而有經驗的玩家則可以根據之前的攻擊情況判斷下一次攻擊是暴擊的可能性(這對於幻影刺客這種英雄很有意義)。
在視頻遊戲中偽隨機分布很常見,他們的分布狀況並不一樣,生成演算法也根據遊戲的需求有所區別。研究這些東西很有意義的——它不僅可以使我們知道虛擬世界是如何通過數學方法搭建起來的,同時也可以讓我們在遊戲世界中暢玩的時候更加理智一些。要知道某些氪金遊戲即使公布了遊戲概率,其概率分布也不一定就和大家想的一樣。
相關鏈接
DOTA2「偽隨機分布」系統頁面
早期關於War3所使用的偽隨機分布的一篇文章
概率分布的相關解釋
原文鏈接
- 從非洲邁向歐洲——了解Dota2中的偽隨機機制 - 集智專欄
推薦閱讀: