【Earthcomputer】如何用紅石在Minecraft中逆轉和模擬Math.random隨機器?[GPT4總結]
源文檔https://docs.google.com/document/d/1stTJAjLmCXtqctdFOpuv4lylegcmfO8mFrptFtwqb78/edit
GPT4總結
本項目的目標是使用紅石在Minecraft中完全模擬和逆轉Math.random隨機數(shù)生成器。以下是在Minecraft中使用Math.random的完整列表,其中高亮的部分是我們正在使用的重要部分:
以任何方式創(chuàng)建任何類型的生物實體,包括通過正常生成、加載或維度變化創(chuàng)建的玩家、生物和盔甲架。(3次調(diào)用)
當實體受到攻擊時計算擊退力。(可變次數(shù)的調(diào)用)
實體破壞物品時的粒子效果。(5次調(diào)用,每個粒子一次)
實體進食時的粒子效果。(可變次數(shù)的調(diào)用,每個粒子一次。如果完全吃掉一個普通食物,46次調(diào)用)
以任何方式創(chuàng)建物品實體。(4次調(diào)用)
以任何方式創(chuàng)建經(jīng)驗球實體。(4次調(diào)用)
TNT隨機角度。(1次調(diào)用)
液體混合生成石頭、圓石或黑曜石。(16次調(diào)用,每個粒子兩次)
在下界用桶試圖放置水。(24次調(diào)用,每個粒子三次)
當從熔爐輸出槽取出物品時,平均獲得的經(jīng)驗值在0到1之間。(1次調(diào)用)
生物生成算法中的生物群體大小。(每個生物群體1次調(diào)用)
逆轉過程將Math.random的當前種子逆轉,以便我們可以預測所有未來(和過去,但沒人關心)的Math.random值。我們只需要使用7個TNT實體的隨機角度,它們從中心被爆炸到半徑為120個方塊的圓上,這樣可以檢測到約1個方塊的分辨率。
通過將線性同余發(fā)生器(LCG)的n個連續(xù)種子視為n維空間中的一個點,我們可以找到一個類似于格子的結構。通過對這個結構進行線性變換,我們可以將其轉換為整數(shù)坐標系,并利用LLL規(guī)約法找到更好的基向量。然后,我們可以使用逆變換將這些基向量轉換回原來的坐標系,并根據(jù)所給條件找到滿足條件的點。在實踐中,我們使用7個TNT的隨機角度,通過692個探測器(以120個方塊為半徑的圓形排列)檢測到這些角度。然后我們根據(jù)這些信息構建一個7維超立方體,以描述這些種子邊界,并按照上述方法進行逆轉。
讓我們深入了解一下線性同余生成器(LCG)和如何使用LLL規(guī)約法找到更好的基向量。
線性同余生成器(LCG):
LCG是一種隨機數(shù)生成器(RNG),其內(nèi)部狀態(tài)(種子)與生成器的當前輸出相同。每次調(diào)用后,LCG會按照以下公式更新其種子:
seednew = (seedcurrent * a) + b (mod m)
其中 a、b 和 m 是精心選擇的常數(shù),以產(chǎn)生類似于隨機序列的輸出。在Java中,這些常數(shù)的值分別是 a = 25214903917,b = 11,m = 2^48。雖然Java選擇了很好的參數(shù),但所有的LCG都不可避免地具有一些共同的弱點。
LLL規(guī)約法:
為了找到更好的基向量,我們可以使用LLL規(guī)約算法。該算法的目的是找到一個較短且近似正交的基向量。這樣做的好處是,我們可以通過搜索較小的整數(shù)坐標范圍來找到滿足條件的點,從而降低計算復雜度。
逆向實踐:
我們使用7個TNT的隨機角度,并通過692個探測器(以120個方塊為半徑的圓形排列)檢測到這些角度。每個探測器對應一個可能的TNT發(fā)射角度范圍。然后,我們根據(jù)這些角度范圍構建一個7維超立方體,以描述這些種子邊界。
接下來,我們需要對該立方體進行線性變換,將其轉換為整數(shù)坐標系,并利用LLL規(guī)約法找到更好的基向量。然后,我們可以使用逆變換將這些基向量轉換回原來的坐標系,并根據(jù)所給條件找到滿足條件的點。
在實踐中,我們會預先計算所有可以預先計算的部分,以降低計算復雜度。在計算過程中,我們將使用LLL規(guī)約法找到的基向量進行逆變換,然后在變換后的坐標系中搜索滿足條件的點。最后,我們將這些點逆變換回原始坐標系,并根據(jù)這些點找到對應的LCG種子。
總之,通過逆向LCG的種子,我們可以預測Minecraft中Math.random的所有未來(和過去)值。這為在游戲中模擬隨機過程提供了可能性,從而使玩家能夠更好地控制和預測游戲中的隨機事件。