「MC篩種雜談1」解讀戰(zhàn)利品表,以及戰(zhàn)利品決定的原理
????理解戰(zhàn)利品的生成原理不僅能知道各種結(jié)構(gòu)中箱子能開出物品的概率,期望,極限(例如古城一個箱子理論可以存在20個附魔金蘋果!但這可以斷言是不可能的),還有助于使用別人的戰(zhàn)利品預測器(第三方篩種庫),以及自己開發(fā)一些前人未覆蓋的內(nèi)容。本篇是介紹篇,之后會繼續(xù)講解如何實戰(zhàn)。

一、被戰(zhàn)利品表控制的內(nèi)容有哪些
考古(1.20新增)
方塊破壞
箱子戰(zhàn)利品
實體被殺死
游戲玩法(釣魚,村莊英雄,貓之晨禮,以物易物,嗅探獸)
二、去哪看戰(zhàn)利品表
缺點:僅有最新版本的表格;wiki擅自對表格進行了排序,但我們利用程序模擬時必須使用戰(zhàn)利品表的原始順序。
解壓相應版本游戲?qū)嵗械?jar文件如1.20.1.jar,訪問文件夾
其中的.json文件即為戰(zhàn)利品表。
優(yōu)點:保留了戰(zhàn)利品表的原始順序;各個版本的均可獲取。
缺點:太丑太難讀了
查看mcfeature第三方篩種庫中整理好的戰(zhàn)利品表
如何找到:閱讀欣雨神的文章配置好IDEA即可

優(yōu)點:保留了戰(zhàn)利品表的原始順序,且較直觀。
缺點:僅有1.16.1版本的戰(zhàn)利品表;仍缺少部分結(jié)構(gòu)的戰(zhàn)利品表。
三、如何解讀戰(zhàn)利品表
戰(zhàn)利品表最基本的兩個要素:獎池(lootPool),獎項(lootEntry)
獎池:一個戰(zhàn)利品表擁有一個或多個獎池。每個獎池具有抽獎次數(shù)(roll),這個次數(shù)可以是常數(shù),也可以由RNG(隨機數(shù)生成器)決定。每個獎池還具有若干的獎項(entry),也就是具體的物品。例如:廢棄傳送門僅有1個獎池,這個獎池的抽獎次數(shù)在4到8中隨機。埋藏的寶藏有6個獎池,其中第一個獎池只抽獎一次,且僅有一個獎項——海洋之心,這保證了每個寶藏必定含有海洋之心。
獎項:每個獎項最基本的三個要素:物品(item),權(quán)重(weight),函數(shù)(function)。權(quán)重決定抽獎時被抽中的概率。權(quán)重越大,越容易被抽到。獎項被抽中后,還會進一步作用一些函數(shù),如設(shè)置數(shù)量,設(shè)置耐久,附魔。值得一提的是存在一種空獎項(emptyEntry),抽中它就相當于抽中了空氣,它存在的作用僅僅是提供無用的權(quán)重,降低獎池中其它獎項被抽中的概率。
實例:這個鏈接會跳轉(zhuǎn)到鐵匠鋪的戰(zhàn)利品表
其中,僅有一個獎池,它會進行3到8次抽獎。獎池中有若干個獎項,具有不同的權(quán)重和函數(shù)。如:鉆石獎項的權(quán)重是3,若抽中會繼續(xù)決定1到3個堆疊。
四、戰(zhàn)利品決定的原理
????每個箱子的內(nèi)容都由一個戰(zhàn)利品表種子(lootTableSeed)和戰(zhàn)利品表(lootTableSeed)完全決定。在一個固定的世界種子下,這些信息也是固定的,下期會講解對任意的世界種子,如何篩選某些坐標范圍內(nèi)是否有箱子,箱子的內(nèi)容是否符合所需?,F(xiàn)在先講解如何由lootTableSeed出發(fā),得到一整個箱子的內(nèi)容。例如,我用世界種子5464771542393817進入世界,在觀察者模式下,用F3+i查看一個從未打開過的箱子,得到如下信息:
這是一個鐵匠鋪的箱子,它的lootTableSeed就是4883865642824260284,戰(zhàn)利品表如下。
這個表格是我在mcfeature第三方篩種庫的源碼中摘錄的,大概不難看懂。
生成戰(zhàn)利品的流程:將一個隨機數(shù)生成器(記為rand)的種子設(shè)置成上述lootTableSeed,
然后考慮第一個獎池。它擁有3-8次抽獎次數(shù),那么我們對這個rand,生成6以內(nèi)的整數(shù),再加上3,即決定好了抽獎次數(shù)(結(jié)果是8)。
現(xiàn)在考慮第一次抽獎。我們注意到戰(zhàn)利品表中所有獎項的權(quán)重加起來是94,那么我們生成94以內(nèi)的整數(shù),并比對結(jié)果在哪個區(qū)間,就決定好是哪個獎項了。
注意到結(jié)果是82,這對應了黑曜石,為什么呢?
對上面提及的戰(zhàn)利品表,黑曜石在較后方,可以從末尾開始考慮。93代表鉆石馬鎧,92代表金馬鎧,91代表鐵馬鎧,88-90代表鞍,83-87代表橡樹樹苗,78-82代表黑曜石。
既然確定好是黑曜石,下面要作用函數(shù)了。很明顯,它只具有一個決定數(shù)量的函數(shù),沒有其他的函數(shù)。因為數(shù)量是3-7之間,我們使用語句
得到了7,也就是說這個獎項是7個黑曜石。第一次抽獎結(jié)束。
同樣地,繼續(xù)抽剩下的7次獎,最終8次抽獎加起來是54個黑曜石。戰(zhàn)利品生成完畢。
至此,想必你已經(jīng)完全理解了原理。雖然看起來步驟很多,但幸運的是已經(jīng)有前人幫我們寫好了程序,只要輸入lootTableSeed和lootTable,就能自動完成上述所有步驟。相關(guān)內(nèi)容我將在下期講解。此外,我認為還是有必要細講一下獎項的函數(shù)部分。
五、獎項的函數(shù)
????上面已經(jīng)出現(xiàn)過了一個函數(shù)——設(shè)置數(shù)量(setCount)。除此之外,還有以下幾種:
設(shè)置損壞(applyDamage):例如出現(xiàn)在堡壘遺跡的藏寶室的寶藏箱子中。以下是路徑:
耐久不滿的鉆石裝備就由此實現(xiàn)。流程:rand.nextFloat(0.8)+0.1,其中數(shù)值視情況而定。
設(shè)置隨機附魔(EnchantRandomly):大部分附魔裝備由此實現(xiàn)。先得到這件裝備可用的附魔列表(這是固定的,次序也是固定的),然后得到列表的長度,取此長度之內(nèi)的隨機數(shù),以決定附魔種類?,F(xiàn)在決定附魔等級:如果附魔僅有一級,那么跳過;否則取最高等級之內(nèi)的隨機數(shù),以決定附魔等級。例如:金鎬的可用附魔列表如下:
先使用rand.nextInt(6),假如得到3,這代表時運。然后決定等級,rand.nextInt(3),假如得到0,這代表時運的等級是1。所以金鎬的附魔就是時運1。
可見,這個函數(shù)僅會提供一項附魔魔咒,且各魔咒出現(xiàn)的概率均等。確定魔咒后,各等級的概率也均等。
等級附魔(enchantWithLevels):相當于玩家在附魔臺操作一次。要塞圖書館,末地城用的都是這個函數(shù)。這可以得到多項附魔,還能開出寶藏附魔(經(jīng)驗修補等),但原理較復雜且一般篩種時不涉及這些較為游戲后期的建筑,故不詳細講解。
六、種子知識,以及簡單的概率論
????用來生成戰(zhàn)利品的隨機數(shù)生成器,是線性同余生成器(LCG)。它設(shè)置種子時,可以輸入(二進制)64位整數(shù),也就是2^64的范圍。然而,因為LCG的特性,只有后半48位生效,也就是說,只要兩個lootTableSeed的后48位相同,它們就會導出完全相同的戰(zhàn)利品??梢?,一個lootTableSeed擁有2^16=65536個姐妹種,它們有相同的戰(zhàn)利品。
????姐妹種這件事?lián)碛泻锰?,如果我們已?jīng)得到了一個神種,比如說上面舉例使用過的那個鐵匠鋪54黑曜石的lootTableSeed,那么我們相當于得到了65536個神種。
????但也有壞處,因為這導致MC中只有2^48個不同的lootTableSeed,從追求極限上來說,這是不利的。我們常常聽說一個有趣的事情,假定一只永恒的猴子隨機地敲打鍵盤,那么在無盡的歲月中,它總能敲出一部莎士比亞的著作。這就是說,盡管概率很小,但只要嘗試次數(shù)無限,它總能發(fā)生一次。然而,我們的lootTableSeed卻從2^64減少到2^48個,因此許多小概率事件變得更加無法發(fā)生了。例如,鐵匠鋪箱子理論最多有56個黑曜石,其概率是
再乘以我們的樣本空間大小有
這個數(shù)字遠小于1,基本上可以認為不可能了;事實上,我們通過某些方法也證明了確實不存在這樣的lootTableSeed。
七、有趣的課后習題
????翻閱wiki相關(guān)頁面,解答如下問題。
一把金鎬,在設(shè)置隨機附魔(EnchantRandomly)時,得到效率5的概率
為什么說20附魔金蘋果的古城箱子是不存在的
預測一個廢棄傳送門的箱子,有6個附魔金蘋果的可能性
為什么橋類型的堡壘遺跡必出一個磁石
mojang在1.20更新中,為許多結(jié)構(gòu)增加了鍛造模板的戰(zhàn)利品,而不影響原有的戰(zhàn)利品,這是怎么實現(xiàn)的