明日方舟的概率與隨機數(shù)代理學理論
零、前言
明日方舟的戰(zhàn)斗中經(jīng)常面臨概率問題,如亂火跳10sp還是19sp,夜幕突襲出束縛還是減速。本文試圖從程序層面解釋游戲中概率事件的判定原理,并討論如何利用代理保存隨機數(shù)軸完成課題攻略。
一、隨機事件的判定原理
對游戲中的一個隨機事件進行判定時,程序會進行以下三個步驟:
1.?程序根據(jù)事件本身的結果和概率,制定判定規(guī)則;
2.?在事件即將發(fā)生時,生成一個隨機數(shù)(浮點數(shù),可理解為0-1之間的小數(shù))用于判定;
3.?對隨機數(shù)應用判定規(guī)則,得到結果。
?
給出實例,對于角色傀影的技能夜幕突襲,程序的運行邏輯遵循:
1.?夜幕突襲會產(chǎn)生停頓/眩暈/束縛三種可能的效果,且三種效果發(fā)生的概率相等,均為1/3?,F(xiàn)制定判定規(guī)則為:當隨機數(shù)X滿足0<X<0.33時,產(chǎn)生停頓;當隨機數(shù)X滿足0.33<X<0.66時,產(chǎn)生眩暈;當隨機數(shù)X滿足0.66<X<0.99時,產(chǎn)生束縛。
2.?在使用夜幕突襲時,生成隨機數(shù)X,現(xiàn)設X=0.75。
3.?根據(jù)判定規(guī)則,X=0.75滿足0.66<X<0.99,故本次夜幕突襲產(chǎn)生效果為束縛。
二、代理保存隨機數(shù)原理
在得知隨機數(shù)的工作原理后,一個新的問題來了,隨機數(shù)是如何計算出來的?為什么代理作戰(zhàn)可以保存概率?這個過程是否可控并幫助攻略?
直接給出結論:每次作戰(zhàn)開始時會生成一個種子s,該作戰(zhàn)中所有隨機數(shù)X均由這個種子s計算得到,如函數(shù)X[n]=F(s,n)。這個函數(shù)的意義是,作戰(zhàn)中的第n個隨機數(shù)X[n]的生成受種子s和序號n的影響。所得序列X[n]稱為一次作戰(zhàn)的隨機數(shù)軸。
當你點擊保存代理按鈕后,prts會忠實地為你記錄下這把游戲的種子s。在你開始代理作戰(zhàn)后,系統(tǒng)會復現(xiàn)你的操作,并在每次遇到概率點時使用種子s計算隨機數(shù)X[n],這樣復現(xiàn)出來的隨機數(shù)序列X[n]和通關的完全相同。操作完全相同、概率點判定結果完全相同,因此可以代理成功。
注:我們一般認為種子s和隨機數(shù)X的生成過程不可由人力計算得到。目前已有通過程序遍歷種子庫暴力計算所有隨機數(shù)討論攻略理論的實例(https://www.bilibili.com/video/BV1xU4y1Y7M1),本文不討論此方法的可行性。
以下是一個隨機數(shù)軸的實例

可以看到,在這把游戲中一共發(fā)生了12次隨機事件,所用到的12個隨機數(shù)為X[1]=0.95,X[2]=0.6,...,X[12]=0.4。
點擊保存代理后,系統(tǒng)會根據(jù)種子s計算,復現(xiàn)出這個隨機數(shù)序列X[1]=0.95,X[2]=0.6,...,X[12]=0.4。
我們試著給出判定規(guī)則,來看看每個概率點的判定結果。
風笛攻擊:有28%的概率暴擊,72%的概率不暴擊?,F(xiàn)規(guī)定:0.2<X<0.48時風笛攻擊暴擊,否則不暴擊。
傀影3技能夜幕突襲:夜幕突襲會產(chǎn)生停頓/眩暈/束縛三種可能的效果,且三種效果發(fā)生的概率相等,均為1/3?,F(xiàn)規(guī)定:當隨機數(shù)X滿足0<X<0.33時,產(chǎn)生停頓;當隨機數(shù)X滿足0.33<X<0.66時,產(chǎn)生眩暈;當隨機數(shù)X滿足0.66<X<0.99時,產(chǎn)生束縛。
黑攻擊:有20%的概率暴擊,80%的概率不暴擊?,F(xiàn)規(guī)定:0.3<X<0.5時黑攻擊暴擊,否則不暴擊。
亂火:隨機提供10-19點sp。現(xiàn)規(guī)定:0<X<0.1時亂火值為10,0.1<X<0.2時亂火值為11,以此類推,0.9<X<1時亂火值為19。
槐琥攻擊:有20%的概率暴擊,80%的概率不暴擊。現(xiàn)規(guī)定:0<X<0.2時槐琥攻擊暴擊,否則不暴擊。
根據(jù)上述規(guī)則,可補完隨機數(shù)軸產(chǎn)生的效果。

三、隨機數(shù)代理學
本節(jié)主要討論兩個問題:如何根據(jù)種子和隨機數(shù)軸的工作原理調出我們想要的隨機數(shù),代理中為什么會出現(xiàn)隨機數(shù)軸錯亂。
?
仍以上節(jié)中的隨機數(shù)軸為例。

如果我們想讓最后這個傀影打出束縛效果,應該怎么做呢?
觀察到這個傀影使用第12個隨機數(shù),而軸中第14個隨機數(shù)值為X=0.9,恰好判定為傀影出束縛。因此,只要在傀影前插入兩個隨機事件,占用第12和第13個隨機數(shù),讓傀影使用第14個隨機數(shù)即可。例如:

還有一個方案。軸中第11個隨機數(shù)值為0.85,符合傀影出束縛的判定,因此刪去原本第11個隨機事件,讓傀影使用第11個隨機數(shù),即讓槐琥少攻擊一次即可。

該方法在實戰(zhàn)中應用總結為:插入或刪除隨機事件,來將某個概率點調整到想要的隨機數(shù),以產(chǎn)生想要的隨機效果。一個比較好的參考是https://www.bilibili.com/video/BV147411i7RD。
當然,調代理并不是概率掛,該方法的局限性也是相當大的:1.你需要保存一把隨機數(shù)較好的代理,這往往需要你在課題所需陣容上額外帶上史爾特爾等強力安全帶,對不能使用代理的課題如高難13人攻關、尖滅測試等無代理關卡不適用;2.你需要一個一個試出該代理的隨機數(shù),這需要花費大量時間、精力和理智;3.修改的隨機數(shù)必須從軸里找,例如你需要把一個亂火調成19,但目標點前后5個隨機數(shù)均不滿足,如果插入/刪除5個隨機事件來強行調隨機數(shù)可能對你原本軸產(chǎn)生巨大影響。
?
最后簡單說說代理中隨機數(shù)軸錯亂的問題。前文提到過,代理想要成功運行必須滿足:操作完全相同、概率點判定結果完全相同。實戰(zhàn)中遇到的絕大多數(shù)隨機數(shù)軸錯亂來源于沒能百分之百復刻作有:火山的索敵和德克薩斯/異格德克薩斯的劍雨都是受隨機數(shù)影響的,這樣短時間多次隨機數(shù)判定極易因代理幾幀的失誤影響隨機數(shù);部分敵人和地圖產(chǎn)生效果消耗隨機數(shù),如安多恩的彈射。而同樣種子計算出不同隨機數(shù)序列的情況僅在跨版本代理中理論存在(版本號參與隨機數(shù)生成)
四、說明
本文使用數(shù)據(jù)均為輔助說明,與實際程序運行中使用數(shù)值不同。尤其隨機數(shù)對應具體事件效果,這方面需要大量實戰(zhàn)測試。
參考:https://prts.wiki/w/%E4%BD%9C%E6%88%98%E6%9C%BA%E5%88%B6/sandbox#.E9.9A.8F.E6.9C.BA.E4.BA.8B.E4.BB.B6.E7.9A.84.E4.BB.A3.E7.90.86.E5.8E.9F.E7.90.86.5B.E7.90.86.E8.AE.BA.E5.8F.82.E8.80.83_3.5D