戰(zhàn)場兄弟策略隨寫:(2)骰子迷思

隨機數(shù)基礎
隨機數(shù)表
了解計算機的玩家都知道計算機沒有真正的隨機數(shù),通過預先生成的列表提供數(shù)據(jù)。這些表格在制作的時候就已經(jīng)考慮到了分布情況。
列表的缺點:如果每一次都用同一個列表,我們是可以完美預測到下一個數(shù)字的。
實際操作上計算機會提供多個列表,大部分開發(fā)者根據(jù)當前時間或者類似的方法來確定使用哪一張列表(種子)記憶模糊:我記得早期 BB 似乎如此,還提供了一個每次隨機種子不同的選項?
PRNG
但顯然熟悉代碼的朋友們,很容易看出 Squirrel 腳本和 ECMAScript 很相近,也就是我們熟知的 Javascript。很多類似的解釋器,會使用偽隨機算法來獲得隨機隨機值,實現(xiàn) Math.random() 函數(shù)。
其中最經(jīng)典的就是梅森回旋,他會依賴上一個隨機數(shù)的計算結(jié)果,去計算下一個隨機數(shù)。當然現(xiàn)在也有新的乘法/加法進位法來生成隨機數(shù)。但是本質(zhì)上是一樣含有狀態(tài)的。簡言之就是他是包含狀態(tài)依賴的。
PRNG的缺點:同隨機數(shù)表一樣,相同的種子肯定算出相同的數(shù)列。
Low-Discrepancy Sequence
以上兩種隨機數(shù)方式,都能獲得“均勻分布”的數(shù)列。但是實際情況,則是他們的分布仍然“不夠均勻”。所以金融和CG領(lǐng)域會采樣 Low Discrepancy 數(shù)列(+Shifting)來獲得更“均勻”的結(jié)果。但是顯然,BB沒有采用這一種方式。
我們做個實驗便知。
骰子到底有沒有灌鉛?
實驗方式
實驗的方法很簡單,我們在攻擊時,將擲骰子的行為重復 1000 次,然后進測試場景攻擊幾次變能獲得足夠的測試數(shù)據(jù)。
在 scripts/skills/skill.nut, Line: 1411,我們增加如下代碼。
樣本分析
戰(zhàn)斗結(jié)束后,我們將數(shù)據(jù)導入到?excel 中進行處理。我們將1-100分成10個組,對隨機數(shù)采樣結(jié)果計算占比。

可以很明顯的看到,當數(shù)據(jù)量超過2000之后,每個分組的占比逐步回歸均勻。觀察柱狀圖表能更清楚對比差異。
如果我們用8000個樣本數(shù)據(jù)和30個數(shù)據(jù)進行比較的時候,可以看到30樣本的分布很有趣。

考察8000樣本的時候,我們可以看到每個區(qū)間的占比基本落在 10%附近,可以用作參考。
顯然的,在前30個樣本里,Roll點有更多的次數(shù)落在 (20, 30]?,而10以下一次都沒有。50樣本類似。
一般來說低差序列不會產(chǎn)生這樣的情況,會分布非常均勻。
重采樣
另一方面,重采樣會影響樣本分布是一些玩家會忽略的情況。從我們在游戲中有幾個有趣的限制,包括
戰(zhàn)斗中Roll點是敵人和我方輪流進行的。
許多戰(zhàn)斗在接敵之后,一般也就持續(xù)5個回合左右。
基于以上情況,我們在樣本空間中重采樣,就簡單按順序跳著采樣,每8個樣本取一個。在這個基礎上,我們隨便拉出20個樣本來看看。

從圖表中可以看出,如果這場戰(zhàn)斗的順序是一直沒改變的條件下,第一人一直 roll 出70+,偶爾能roll 出 30+ d的命中。第二個人會有很多機會 roll 出 60 以下的數(shù)值。
而與之相反的,第8個行動的人恐怖如斯,基本都會命中,甚至不會roll出 90+的數(shù)值。那么大概率會有玩家覺得骰子被“灌鉛了”。
技術(shù)上是否規(guī)避這個情況?
分兩個層面。
從均勻?qū)用嫔咸接懀琇ow-Discrepancy 的方法能很“均勻”的投擲骰子。但是如果我舉一個極端的情況,拋硬幣,每一次都一正一反,那么在重采樣的情況下,2個人物的命中將會變?yōu)?100% 和 0%。
從狀態(tài)依賴層面而言,為了避免這種極端情況,我們一般會對每一個玩家提供自己的骰子(單記錄狀態(tài))就可以規(guī)避。那么,50%的命中率,你可以很安心的認為2次攻擊肯定會中一次。即使因為隨機發(fā)生器出現(xiàn)了偏差,你也可以明確的知道下一個回合的兩次攻擊一定全中。
這對策略安排非常友好。所以為什么官方不采用這些改進方式?我不知道。但我也曾經(jīng)嘗試過修正過這個情況。最終的結(jié)論就是:不好玩。缺少偶然性,沒有戲劇性,沒有機械降神。
換句話說 50%的命中率,只需要2個回合,神選怒火就一定會降臨在你的身上。
補充:命中率
如果你對以上圖表看的不是很明白,那么我補充一下累計分布圖來看看命中情況吧。

第一組樣本,60以下的roll點很少,意味著如果他命中率在50以下,大概率不會擊中敵人(笑哭)。但如果他最終命中率超過了70,那他基本刀刀烈火。
第二組樣本能 roll出更多的?30-?的值,而 60 也有很多。但是因為90以下的只有80%的樣本,因此此人會比普通人有更多的幾率大失敗無法命中敵人。
第八組樣本,我覺得應該是絕對代表哥布林吧!它甚至不會 roll 出 90 以上的點數(shù)。絕對的灌鉛
當然,我們只是理想的考慮按順序的攻擊 roll 點,其他按下不表。
對玩法的影響
到此為止,骰子灌鉛的答案已經(jīng)不重要,更重要的是骰子表現(xiàn)出來的情況,會如何影響我們的策略。
隨機值是均勻的,但是我們考量的是采樣結(jié)果。特別是小樣本情況下,分布不屬于我們直覺上的“均勻”。在宏觀概念上樣本仍然是符合直覺的。
大概率情況,實現(xiàn)方式采樣偽隨機數(shù)生成器。這種方式是狀態(tài)依賴的,多個人共用一個骰子的情況下,會造成實際結(jié)果的更不“公平”。
重采樣的方式會對樣本空間造成影響,但這導致的結(jié)果和 2 差不多。
即使是實體骰子,也會因為場地因素影響不會絕對公平。
基于以上結(jié)論,在特定的戰(zhàn)斗情況下,我們用概率去考量骰擲結(jié)果不是一個很明智的選擇。而且追求樣本均勻,可能會更“公平”,但不一定更“有趣”。
我們結(jié)合第一篇的底層思路,Anti-Pseudo 的方式去游玩本身就是一種保底策略玩法。這是我為什么推薦 Fast Adaption 的原因。你可以從以上的實驗結(jié)果,很明顯的感受到,+10命中 ≠ 增加10%的命中幾率。從累積分布圖里可以看到,60點與70點區(qū)間差了30%的樣本。
連續(xù)多刀不中的情況確實挺影響心情的,不妨考慮一下你面對一個逃跑的敵人,你在用 22 命中的匕首對他拔甲。
但是有了 FA,就有一個“信息”,告訴你這人一定會擊中目標。這也是 9L、HH 帶來的信息優(yōu)勢,這些信息會左右到你戰(zhàn)場上的策略選擇。也會給你在前期帶來巨大的優(yōu)勢。
至于 Lv2 點 Student 不在此文討論內(nèi)容,每個人都有他的游玩習慣,我也不想強迫你按照我的方式去玩游戲。