伪随机数发生器

来自神奇宝贝百科

伪随机数发生器用于在系统需要随机数的时候,通过一系列种子值计算出来的伪随机数。因为生成一个真正意义上的“随机数”对于计算机来说是不可能的,伪随机数也只是尽可能地接近其应具有的随机性,但是因为有“种子值”,所以伪随机数在一定程度上是可控可预测的。

发生器会先产生一个种子值,这个数字通常是设备启动或者软件开始运行的具体时间,有的时候也会从用户输入的内容中产生,因为这些数字难以产生第二次,因此显得比较随机。

游戏中

线性同余随机发生器(LCRNG)

竞技场系列第三世代第四世代中,使用32位LCRNG。种子值位于0到0xFFFFFFFF之间。若之前已调用生成器,则种子值为使用上次生成器生成的种子值计算的结果值。

  • N64竞技场系列:结果值 = (0x41C64E6D * 种子值 + 0x0000303B
    • 这个算法会利用N64的数据存储器进行多次运行,之后与另一伪随机数进行异或运算。
  • NGC竞技场系列:结果值 = 0x000343FD * 种子值 + 0x00269EC3
  • 《寶可夢》系列中:结果值 = 0x41C64E6D * 种子值 + 0x00006073

第五世代起,使用新算法计算的64位的LCRNG:结果值 = 0x5D588B656C078965 *种子值 + 0x0000000000269EC3 在《寶可夢》系列中,这个算法结果用于以下内容:

选择伪随机数发生器(ARNG)

第四世代中还有用于替换、重置和修改结果值一个不同的算法:

结果值 = 0x6C078965 * 种子值 + 0x00000001

这个算法结果用于以下内容:

梅森旋转算法(MTRNG)

梅森旋转算法是从第四世代开始使用的另一种生成伪随机数的方式。这种算法一次生成624个随机数,在需要的时候提取使用,当所有624个数字使用完毕之后,就会生成下一组。 这个算法结果用于以下内容:

乱数操作

乱数操作是在系统的伪随机数发生器上采取的一系列操作,以获得自己想要的宝可梦。比如异色与否,特定的个体值或个体值组合(以决定觉醒力量的属性)以及特定性格的宝可梦。

游戏中的初始种子是可以通过各种表现逆向计算出来的,之后的该种子值的“随机数”也就可以预测了。《綠寶石》的初始种子是0,《紅寶石/藍寶石》在时钟电池失效后的初始种子为5A0,第四世代使用NDS的日期、时间以及开始游戏和按下“继续”之间的延迟生成种子。第五世代在任天堂的标志出现之前,使用DS的日期、时间、按下的特定键和其他随机信息共同生成种子。

只要搜索符合要求的特征的初始种子,就可以控制遇到的宝可梦的数据。因为从蛋中孵化的宝可梦和野外遇到的宝可梦的特性生成方法不同,所以可选方法有很多。

第三世代第四世代中,因为玩家的真ID No.和里ID No.共同决定宝可梦是否异色,所以通过特定方法生成的異色寶可梦只可能拥有特定的个体值。因为活动赠送宝可梦采用定时器储存器来生成性格值,所以无法控制性格。在第五世代中则不会这样,因为个体值和性格值使用两种不同的伪随机数发生器生成。

细节

  • 乱数操作与利用外部程序修改游戏记录或使用金手指有本质区别,具体区别可参考如下表:
对比内容 乱数操作 利用外部程序修改游戏记录
前置条件 可使用第三方软件逆向游戏算法数据,部分机制也可仅通过表象总结规律 需使用第三方软件逆向游戏算法数据
操作过程 无需第三方软件对游戏数据进行修改,但也可使用第三方软件对游戏数据进行查看监控 需使用第三方软件对游戏记录进行直接修改
操作结果 数据为游戏随机运行时可正常生成的数据 数据可能出现游戏运行时无法生成的数据

大部分乱数操作在游戏过程中并不需要访问游戏内存,这些算法机制不需要破解游戏,可以通过游戏内可直接获得的数据总结规律。

也有部分乱数操作会通过第三方工具直接控制游戏主机,在指定时机進行操作,避免錯過目標隨機數。不同于不断地模拟按键信号操作的自动化软硬件,其并非尝试击中目标随机数。

外部链接