偽隨機(jī)分布與游戲中的隨機(jī)事件

近期雖逢春節(jié)假期,但正值疫情嚴(yán)重,不宜出門(mén)。寫(xiě)下此文也希望能作為網(wǎng)友們?cè)诩业囊黄x物,消磨時(shí)間。

概率,在各種有著“角色”與“技能”設(shè)定的游戲中,是用于設(shè)計(jì)技能的常用工具。常見(jiàn)的“暴擊”、“擊暈”等都大多是概率性觸發(fā)。概率的存在,避免了只能設(shè)計(jì)為“有”或“無(wú)”的一刀切,使得通過(guò)觸發(fā)頻率進(jìn)行平衡性調(diào)整成為了可能。
然而,這類(lèi)概率事件是否觸發(fā)并非完全的隨機(jī),而是使用一種被稱(chēng)為“偽隨機(jī)”的方式。早在初中時(shí)我便聽(tīng)說(shuō)了“隨機(jī)種子”的存在,當(dāng)時(shí)就奇怪,這種存在使得隨機(jī)失去了無(wú)法預(yù)測(cè)的特性,從而丟失了隨機(jī)的意義。后來(lái)直到大學(xué),在通信的加密中接觸到了偽隨機(jī)的概念,只是仍然對(duì)于相關(guān)知識(shí)死記硬背,未能理解到其意義。直到現(xiàn)在結(jié)合一些對(duì)游戲機(jī)制的探究,才理解了偽隨機(jī)存在的意義。
??偽隨機(jī)序列
把需要隨機(jī)判定事件簡(jiǎn)單地看為拋硬幣。那么在使用偽隨機(jī)設(shè)定游戲過(guò)程中,進(jìn)行一次拋硬幣,并非玩家即時(shí)拋一枚硬幣查看正反結(jié)果,而是有別人很久以前就拋過(guò)的硬幣,此時(shí)的游戲只是將那時(shí)的結(jié)果予以復(fù)現(xiàn)。
只是,一場(chǎng)游戲不會(huì)只有一次隨機(jī)事件判定,因此恒久以前的那次拋硬幣也不會(huì)只拋起一次,而是有著理論上近乎無(wú)限次。這無(wú)限多次分為很多輪,每輪中的所有硬幣正與反的結(jié)果構(gòu)成一條順序,這條順序就是“偽隨機(jī)序列”。
每一輪拋硬幣對(duì)應(yīng)一條偽隨機(jī)序列,總共n輪就有n條偽隨機(jī)序列。而開(kāi)啟游戲時(shí),會(huì)從這n條序列中選取一條,作為本場(chǎng)游戲中所有硬幣正反的依據(jù)。這次選取,才是真正的隨機(jī),是真正的不可被預(yù)測(cè)的獨(dú)立事件。
??為什么要用偽隨機(jī)序列?
只要有一些數(shù)理意識(shí)就會(huì)敏感地發(fā)現(xiàn),如此簡(jiǎn)單地復(fù)現(xiàn)以前的結(jié)果是破壞隨機(jī)的不可預(yù)測(cè)性的。事實(shí)也的確如此。但偽隨機(jī)序列存在的最大優(yōu)越性在于,平衡隨機(jī)的分布。由于每一條序列都可以被觀察并篩選。這個(gè)篩選過(guò)程可以幫助剔除掉一些極端情況,如在游戲中可體現(xiàn)為“一直不暴擊”和“一直連著暴擊”。篩選掉極端情況,以此使得玩家感受到的觸發(fā)概率與設(shè)定上的相等,以此保護(hù)玩家體驗(yàn)。
至于偽隨機(jī)的唯一缺點(diǎn),可借由增加偽隨機(jī)序列總數(shù),即前文提及的n來(lái)解決。如果要借用偽隨機(jī)的特性來(lái)“預(yù)知未來(lái)”,前提是要保證未來(lái)和已知的“時(shí)間線”完全相同。而當(dāng)n的數(shù)值越大,對(duì)于一名玩家而言就越難遭遇兩次相同的偽隨機(jī)序列,越難出現(xiàn)“時(shí)間線”相同。
??應(yīng)用偽隨機(jī)序列
首先是偽隨機(jī)序列的選取。這次選取會(huì)是一個(gè)真正的隨機(jī),會(huì)調(diào)用隨機(jī)函數(shù)來(lái)處理,選擇的依據(jù)可以由時(shí)間、硬盤(pán)序列號(hào)等來(lái)組成,組成的依據(jù)被稱(chēng)為“隨機(jī)種子”,可以理解為諸多時(shí)間線的序號(hào)。隨機(jī)種子一般默認(rèn)使用時(shí)間。在游戲以外的一些場(chǎng)合,如果對(duì)真隨機(jī)的要求更高,可以采用更為離譜的客觀變量,例如網(wǎng)站http://random.org/使用大氣噪音生成真隨機(jī)數(shù)。
其次,游戲中的隨機(jī)事件多,概率并不均等,因此對(duì)于它們是否觸發(fā)的判定無(wú)法直接調(diào)用相同的序列來(lái)解決。但是,如果概率之間存在倍數(shù)關(guān)系,則可以通過(guò)考察序列中多次值來(lái)進(jìn)行判定。舉例說(shuō)明:假定有一偽隨機(jī)序列,包含0與1,分布概率各位50%。則用于50%概率事件判定可直接調(diào)用作為判定依據(jù);用于25%概率事件判定則可每2位作為一次判定依據(jù)。
但是,某些概率值將占用序列中的很多位來(lái)計(jì)算,甚至有些不可轉(zhuǎn)化為分?jǐn)?shù)的數(shù)值無(wú)法計(jì)算。為了計(jì)算方便,多數(shù)游戲中隨機(jī)事件觸發(fā)概率會(huì)有不少的相等數(shù)值和倍數(shù)關(guān)系數(shù)值;以及,許多公布的數(shù)值很可能經(jīng)過(guò)取整,與實(shí)際值不等。
當(dāng)然,上述舉例中不同概率事件采用了同一偽隨機(jī)序列,實(shí)際上也可以采用不同的序列。
除此以外,因?yàn)閭坞S機(jī)序列是經(jīng)過(guò)篩選保證總體分布均勻的,故每次判定不再是獨(dú)立事件了。這意味著,如果出現(xiàn)連續(xù)多次不觸發(fā),下一次觸發(fā)的概率就大大上升了。反之,觸發(fā)一次過(guò)后的下一次,連續(xù)觸發(fā)的可能性就大幅降低了。
??在明日方舟中預(yù)知未來(lái)
游戲《明日方舟》中有一名為“代理作戰(zhàn)”的存在,意味記錄玩家的操作過(guò)程并復(fù)現(xiàn)來(lái)實(shí)現(xiàn)自動(dòng)作戰(zhàn)。但是實(shí)際上被復(fù)現(xiàn)的不只是玩家的操作,還有偽隨機(jī)。而且每次作戰(zhàn)只會(huì)采用一條偽隨機(jī)序列,被所有角色和技能共享。這使得“預(yù)知未來(lái)”的難度大幅降低,借由“預(yù)知未來(lái)”獲益的門(mén)檻也大幅降低。通過(guò)控制一條序列中的判定依據(jù)分配,可以使得集中在某些情況下的概率事件判定全部判定為“觸發(fā)”。說(shuō)得通俗一些,先行測(cè)試一條偽隨機(jī)序列,定位序列中一段有連續(xù)多個(gè)“1”的位置,再通過(guò)使用別的概率事件把這段位置前的所有位頂?shù)?,可以?shí)現(xiàn)某位干員在吃到Buff后的每次攻擊都觸發(fā)暴擊。
??不是一條序列,而是實(shí)時(shí)算法
借由這種破壞掉隨機(jī)事件獨(dú)立性,也可用于算法主動(dòng)生成偽隨機(jī)序列,這就是“偽獨(dú)立疊加”。譬如一個(gè)概率的事件,首次判定時(shí)設(shè)定概率為C,若不觸發(fā),下次判定時(shí)變?yōu)?C,以此類(lèi)推,第N次P(N)= C×N,直至觸發(fā)后,再將此概率重置為C。只要保證基于該算法下的宏觀上觸發(fā)概率與真隨機(jī)需要的概率相等,這一方式便不破壞平衡性。這樣使用算法就不會(huì)占用預(yù)置偽隨機(jī)序列的存儲(chǔ)空間了。
事實(shí)上,現(xiàn)下多數(shù)競(jìng)技性游戲中涉及的偽隨機(jī)也是采用這種或類(lèi)似方式,而不會(huì)真的去構(gòu)建一堆龐大的、保密的偽隨機(jī)序列,例如Dota2:https://dota2.gamepedia.com/Random_distribution
至于上文提到的明日方舟,實(shí)在是少數(shù)。這也應(yīng)該與游戲過(guò)程中需要進(jìn)行隨機(jī)判定的次數(shù)有關(guān)。明日方舟最持久的作戰(zhàn)應(yīng)該是剿滅作戰(zhàn),一般20~30分鐘左右,可帶入干員12位,輪流上場(chǎng),有天賦和技能兩種可能涉及概率的需求。而Dota2一般30~40分鐘,10名英雄同時(shí)上場(chǎng),有4個(gè)技能和無(wú)法肯定數(shù)值的裝備,除此之外野怪等也擁有技能,線下版本還要考慮野怪掉落裝備的概率,總體涉及概率事件的量相當(dāng)龐大。
因?yàn)榈贜次的概率為C×N,且N為自然數(shù),所以必定存在N使得C×N ≥ 100%,即必定觸發(fā)此概率事件。例如Dota2觸發(fā)率為35%的技能“劍舞”,第七次觸發(fā)概率為112%,八次不暴的可能性直接從游戲機(jī)制的層面被徹底移除了。這也是前面所述的避免極端概率事件出現(xiàn)的一種體現(xiàn)。
??游戲以外
除了游戲以外,幾乎所有涉及“隨機(jī)”的地方都有偽隨機(jī)的使用空間,比如音樂(lè)播放軟件的隨機(jī)播放功能??梢圆榈叫侣?,iTunes以前使用的是每次獨(dú)立的隨機(jī),遭用戶(hù)投訴后改為偽隨機(jī)。不過(guò)顯然,這里的偽隨機(jī)并不需要上一節(jié)的那種疊加法,而是簡(jiǎn)單地將播放列表亂序即可。這也是除了先生成、后篩選以外,另一種生成偽隨機(jī)序列的常用方式:洗牌法。
再例舉一處我個(gè)人很贊賞的應(yīng)用方式:模擬現(xiàn)實(shí)。隨機(jī)雖為隨機(jī),但也可以有分布上的要求,例如高斯、泊松等。在用于模擬現(xiàn)實(shí)的作業(yè)中,這種“帶有條件的隨機(jī)”是廣泛存在的。模擬一片墻壁,何處干凈,何處著灰?模擬一片草地,何處泥土,何處芳草?而偽隨機(jī)使得篩選隨機(jī)結(jié)果使?jié)M足要求成為了可能。Cinema 4D中的噪聲著色器便是偽隨機(jī),可以借由“種子”模擬不同的隨機(jī)結(jié)果。此處有一個(gè)Cinema 4D中,把噪聲著色器生成的二維紋理作為三維置換貼圖加以演示的案例,可以用于感受什么是“帶有條件的隨機(jī)”:https://www.bilibili.com/video/av22344452
【完】
