【Earthcomputer】如何用红石在Minecraft中逆转和模拟Math.random随机器?[GPT4总结]
源文档https://docs.google.com/document/d/1stTJAjLmCXtqctdFOpuv4lylegcmfO8mFrptFtwqb78/edit
GPT4总结
本项目的目标是使用红石在Minecraft中完全模拟和逆转Math.random随机数生成器。以下是在Minecraft中使用Math.random的完整列表,其中高亮的部分是我们正在使用的重要部分:
以任何方式创建任何类型的生物实体,包括通过正常生成、加载或维度变化创建的玩家、生物和盔甲架。(3次调用)
当实体受到攻击时计算击退力。(可变次数的调用)
实体破坏物品时的粒子效果。(5次调用,每个粒子一次)
实体进食时的粒子效果。(可变次数的调用,每个粒子一次。如果完全吃掉一个普通食物,46次调用)
以任何方式创建物品实体。(4次调用)
以任何方式创建经验球实体。(4次调用)
TNT随机角度。(1次调用)
液体混合生成石头、圆石或黑曜石。(16次调用,每个粒子两次)
在下界用桶试图放置水。(24次调用,每个粒子三次)
当从熔炉输出槽取出物品时,平均获得的经验值在0到1之间。(1次调用)
生物生成算法中的生物群体大小。(每个生物群体1次调用)
逆转过程将Math.random的当前种子逆转,以便我们可以预测所有未来(和过去,但没人关心)的Math.random值。我们只需要使用7个TNT实体的随机角度,它们从中心被爆炸到半径为120个方块的圆上,这样可以检测到约1个方块的分辨率。
通过将线性同余发生器(LCG)的n个连续种子视为n维空间中的一个点,我们可以找到一个类似于格子的结构。通过对这个结构进行线性变换,我们可以将其转换为整数坐标系,并利用LLL规约法找到更好的基向量。然后,我们可以使用逆变换将这些基向量转换回原来的坐标系,并根据所给条件找到满足条件的点。在实践中,我们使用7个TNT的随机角度,通过692个探测器(以120个方块为半径的圆形排列)检测到这些角度。然后我们根据这些信息构建一个7维超立方体,以描述这些种子边界,并按照上述方法进行逆转。
让我们深入了解一下线性同余生成器(LCG)和如何使用LLL规约法找到更好的基向量。
线性同余生成器(LCG):
LCG是一种随机数生成器(RNG),其内部状态(种子)与生成器的当前输出相同。每次调用后,LCG会按照以下公式更新其种子:
seednew = (seedcurrent * a) + b (mod m)
其中 a、b 和 m 是精心选择的常数,以产生类似于随机序列的输出。在Java中,这些常数的值分别是 a = 25214903917,b = 11,m = 2^48。虽然Java选择了很好的参数,但所有的LCG都不可避免地具有一些共同的弱点。
LLL规约法:
为了找到更好的基向量,我们可以使用LLL规约算法。该算法的目的是找到一个较短且近似正交的基向量。这样做的好处是,我们可以通过搜索较小的整数坐标范围来找到满足条件的点,从而降低计算复杂度。
逆向实践:
我们使用7个TNT的随机角度,并通过692个探测器(以120个方块为半径的圆形排列)检测到这些角度。每个探测器对应一个可能的TNT发射角度范围。然后,我们根据这些角度范围构建一个7维超立方体,以描述这些种子边界。
接下来,我们需要对该立方体进行线性变换,将其转换为整数坐标系,并利用LLL规约法找到更好的基向量。然后,我们可以使用逆变换将这些基向量转换回原来的坐标系,并根据所给条件找到满足条件的点。
在实践中,我们会预先计算所有可以预先计算的部分,以降低计算复杂度。在计算过程中,我们将使用LLL规约法找到的基向量进行逆变换,然后在变换后的坐标系中搜索满足条件的点。最后,我们将这些点逆变换回原始坐标系,并根据这些点找到对应的LCG种子。
总之,通过逆向LCG的种子,我们可以预测Minecraft中Math.random的所有未来(和过去)值。这为在游戏中模拟随机过程提供了可能性,从而使玩家能够更好地控制和预测游戏中的随机事件。