今天看到群里在讨论最长连红,我忽然兴起,打算认真思考一下这个问题。
每次选卡的出怪,是由场景和通过梅森旋转伪随机数算法生成的,其生成的随机序列其起始随机种子唯一确定,而起始随机种子的计算公式是
用户id+存档编号id+选卡次数*101+出怪种子
这个加法是32为无符号整数加法,其中用户id与存档编号id就是游戏存档文件的"gamex_y.dat"中的x与y,且y只能决定从哪一个窗口进入,但无尽内实际场景仍然可由修改器修改,所以存档编号id和场景实际上是无关的(例如月夜并没有游戏原生对应的存档编号id)。
因此,实际上影响出怪的只有场景、选卡次数、出怪种子。注意到101与2互质,因此对每个出怪种子,当遍历选卡次数时,起始随机种子会遍历2^32中的所有值并以2^32为周期不断循环。同时我们可以立即推出,这个循环与且只与场景有关,而且我们可以通过选取出怪种子,使得在任何一个时候(严格来说是选卡次数大于10时),都可以切入到我们需要的点开始(即选择需要的相位)
那么,无炮中有一个常见的需求,是否能挺过超长的连续红眼关(当然严格来说可能这只是具有参考性的指标之一,应该有其他很多方面的指标)。而既然出怪种子意味着相位可以任意选取,那么,长2^32的周期中最长的连续红眼关有且仅有一个,而且任何冲关都会经过且必定会经过这个最长连续红眼关,而且不管从哪一关(例如从2000关)开始游戏,我们都总能设置出怪种子使得接下来就是周期中的最长连续红眼关。
所以,接下来剩余的工作就是找到它。
每次选卡的出怪,是由场景和通过梅森旋转伪随机数算法生成的,其生成的随机序列其起始随机种子唯一确定,而起始随机种子的计算公式是
用户id+存档编号id+选卡次数*101+出怪种子
这个加法是32为无符号整数加法,其中用户id与存档编号id就是游戏存档文件的"gamex_y.dat"中的x与y,且y只能决定从哪一个窗口进入,但无尽内实际场景仍然可由修改器修改,所以存档编号id和场景实际上是无关的(例如月夜并没有游戏原生对应的存档编号id)。
因此,实际上影响出怪的只有场景、选卡次数、出怪种子。注意到101与2互质,因此对每个出怪种子,当遍历选卡次数时,起始随机种子会遍历2^32中的所有值并以2^32为周期不断循环。同时我们可以立即推出,这个循环与且只与场景有关,而且我们可以通过选取出怪种子,使得在任何一个时候(严格来说是选卡次数大于10时),都可以切入到我们需要的点开始(即选择需要的相位)
那么,无炮中有一个常见的需求,是否能挺过超长的连续红眼关(当然严格来说可能这只是具有参考性的指标之一,应该有其他很多方面的指标)。而既然出怪种子意味着相位可以任意选取,那么,长2^32的周期中最长的连续红眼关有且仅有一个,而且任何冲关都会经过且必定会经过这个最长连续红眼关,而且不管从哪一关(例如从2000关)开始游戏,我们都总能设置出怪种子使得接下来就是周期中的最长连续红眼关。
所以,接下来剩余的工作就是找到它。