vp中伪随机数预测与极限一击伤害

作者:Agemo
时间:2004-11-08

本文的主要研究目标是挑战极限一击伤害。为了提高vp(Valkyrie Profile)中人物升级时所增加的属性,分别对小数和大数应用了两种消耗法来预测。这种确定的预测法一方面减少了S/L的次数,另一方面也达到了靠运气所无法S/L出的数值。

一、游戏背景

人物的基础属性值分攻击类与防御类两种。由于vp数据设定一面倒的缘故(攻远大于防,命中远大于回避等),防御类属性在强大的防具面前可以忽略不计。有用的只有攻击类属性,就是战士的STR、魔法师的INT。因为VP没有伤害上限的限制,所以可以自由发挥挑战极限伤害数字。在选好敌人以及武器之后,为了提高伤害值除了固定的Skill、固定个数的提升人物能力的物品(44个金蛋和7个圣血.宝箱精灵之森*3+忘却洞窟*2+红莲迷宫*15。金鸡+b-ending可以生20个蛋,总共44个金蛋。圣杯+b-ending总共7个圣血),剩下的只是升级。

升级加的属性点数是随机的,在升级前反复S/L来可以得到理想的数值,这与常规的凹点法没有区别。极限一击最高伤害只能由フレイ打出。然而,フレイ在最后迷宫加入时固定lv30,实际上数据是第一次进入迷宫时初始化,从lv1自动升到lv30,这样导致了STR值有上下浮动。而升级后STR的增加范围有6-10点这5种情况,所以连升29级STR都加最高值的几率 = 5的29次方分之一 = 1/186264514923095703125

为了对让フレイ最大伤害值再次提高,能深入挖掘的要素目前只剩下升级,即:如何按游戏的规则,让连升29级所加的STR点数尽量高。

二、伪随机数

伪随机数发生器(PRNG),是指通过对一个种子数值(seed)进行迭代运算来产生数值序列的方法,叫“伪”随机数的原因是指产生的数字不是真正意义上的随机数。PRNG主要问题就是伪随机数种子。如果种子是固定的,那么计算输出的伪随机数序列也是固定的。另外因为序列固定,所以有“随机数消耗”这个概念。恰好console主机没有时钟等有随机性的硬件,所以种子在游戏中的实现多数是开机后用一个固定常数初始化,意味着同样的操作会产生同样的结果。为了掩饰这种必然性,可能采用插入自动消耗随机数的方法,就是利用人的输入操作时间不会比帧速快的特点,这样在某些场景中特别是战斗场景,每帧都自动消耗一些随机数,或者根据用户按键的间隔时间消耗随机数等类似方法。

vp中采用了由 Donald E. Knuth 提出的,又称为 GB_FLIP 的伪随机数发生器。不含运算代价高的乘除法,只需55个数值表来进行减法运算就能实现的快速算法。理论上产生的伪随机数序列的循环周期period在2^55-1以上,是有很多应用的优秀的算法。(666的《乱数教程》所提到的圣战系谱里用的实际上也是这种算法的变形)

vp用的初始化种子也是一个固定常数,在游戏reset时初始化,自动消耗只发生在战斗场景。这是普遍的情况,所以能容易进行序列预测。举个例子,开机后读取存档,然后在经验宝珠里面升一级,会发现加的能力点数是固定的,也是这个原因。另外,伪随机数预测法与修改是不同的,修改是打破了游戏的规则。而这个预测是在游戏的规则之下,只不过知道内部运行的机制而已。算是黑盒play与白盒play的区别吧。

三、伪随机数的消耗

下面是一些消耗确定个数的伪随机数的方法:
A、读取迷宫存档 = 当前4人队伍中战士的数目(1-4),魔法师不算,以后分别用A1,A2,A3,A4表示
B、读取天上存档 = 48,也许是对每个地点初始化。
C、在天上开菜单,再关菜单同样 = 48,同上。
D、出剑 = 1。实际上是决定人物的语音。
E、新开始SG = 435 + 队伍战士数(435=29*5*3,是SG的3个隐藏角色升29级而来)
F、击打Lizard塔的镜子 = 25
G、金蛋圣血+4(因为是4项能力)
H、升级+5(因为是5项能力)
等。在迷宫队伍编成也会消耗(天上不会)。

关于读取存档类的额外说明:
·读取存档后不会立即消耗,要等一瞬间,大约跳一下就可以了。
·此场景不能有敌人,如果有敌人需要先解决掉。敌人走动会耗掉随机数。
·不能有中毒等人物状态。
·不能有场景特效,如下雨,下雪,掉火焰等天气效果。
·不能有香味(植物实验场)、某些
·法老王迷宫第一个save、精灵之森、第八章的数字迷宫。

耗掉不固定个数比如有:战斗会随时间自动消耗、敌人走动、天气特效、发射水晶与滑铲等。其中,发射水晶因为是一个粒子系统,因为粒子的数目是随机的,所以决定粒子随机运动所消耗的随机数也不确定。因为消耗的随机数非常多,以后有重要用途。

四、常规的预测法(上)

方法:固定的初始种子必然产生固定的伪随机数序列。为了让两次随机事件的结果相同,只要让随机数消耗个数一样就行了。需要先通过程序作模拟计算(数字小的手工计算也可以),得出需要消耗的伪随机数的个数。

举例:经验宝珠升级时人物四项属性增加值最大。经过程序计算,消耗的随机数最小为 151。
   数字分解 151 = B + 2*C + A4 + D*3
分解后的通俗解释就是(在地下迷宫的情况):
首先当然有这个迷宫的存档,队伍设为A4(4个战士),然后有个天上的存档。开始预测:
·Reset PS/Emu (让伪随机数种子重新初始化)
·读取天上的存档,开关菜单2次
·再开菜单读取地下A4存档,然后出3剑
·开菜单lv up,就是基础属性全加MAX
如果是在天上,或者队伍有变化也同理,用A~F的消耗法自行组合,凑够 151 个伪随机数就行了。

下面的一些消耗个数表,除了挑战极限伤害以外也会用得上。
忘却洞窟2全物品:49 = A1 + B
忘却洞窟3全物品:50 = A2 + B
忘却洞库4全物品:288= B + C*5 (有金蛋。忘却洞窟的研究请参见北欧专题站)
经验宝珠升级四项属性+MAX,DME+99:25241
经验宝珠连升级5级 STR+MAX:179 = B + C*2 + A3 + G*7 + A3 + D
神界报告生蛋4个:96 = B + C,但某章神界报告随机得到道具还要+1等,不行就用普通方法S/L吧。

五、常规的预测法(下)

下面开始正题,如何让フレイ在SG加入后STR尽量高。下表是用程序计算出的有代表性的数据:

————————————————————————
STR 随机数消耗
431 0
441 4
449 288
463 20330
465 412662
468 2067930
471 159711379
476 763225203
...
490 ?????
————————————————————————
从表中可以看出,
·开机之后如果直接新开始SG游戏,则フレイ初始STR固定431
·490是理想最高值 = 初始值200 + 最高10点*29级
·471需要最小的消耗数已经上亿了,意味着第一次达到这么高至少要消耗上亿的随机数,之前不可能出现。不是运气几率的问题。

STR=441时,消耗数分解 4 = A4
STR=449时,消耗数分解 288 = B + C*5
STR=463时,消耗数分解 20330 = B + C*423 + A3

考虑时间问题。消耗确定随机数的方法最快的是F:击打镜子。大概每秒2次=50个/秒,而消耗7亿的随机数要用 7亿/50 = 1400万秒 = 162天。就算有位神人可以日夜不停、不出错地S/L,但是PS能否开机162天还是个问题。所以对于大消耗数的情况,此路不通。

快速方法的消耗数都是不确定的,比如下雪=100/s,下雨=600/s,3个结晶散发冷气=600/s,单独发一个水晶约消耗500,对空发不停水晶=3400/s,靠墙边不停发水晶产生冰雾=6000/s。而如果有办法知道当前的消耗数,这些就可以利用了。

六、大数的预测法

方法:序列固定,Knuth的算法序列重复周期也足够长(至少2^55-1),所以只要有足够的采样值,根据重复概率就能准确计算出当前的消耗数。实现起来,通俗的说法就是:用掉2个圣血,记下四项能力的总共8次增加值。因为圣血随机4项能力+1~20点,所以用了2个圣血后,加能力点数的序列的重复概率是 = 20的8次方分之一 = 256亿方分之一,大于要预测的消耗数值,所以2个圣血就能够判定当前消耗了多少随机数。本文写了一个程序来计算判定。

目前最快消耗法是在下雨+在山坡连发水晶造冰雾约7100/s (每秒60帧的情况下)。如图:


实际上,这种大数预测法本身是可以准确预测到更高的数值。可惜目前没有发现更快速的消耗法。即使秒消耗10万个随机数,PS的CPU也可以负荷得起(主要是这个伪随机数算法的时间cost非常少)。所以如果有更快得消耗法,成绩还能提高。

七、成绩

先估算一下大概的完工时间,后期必须多测量。接近要达到的数字之后,改用数字分解固定消耗法。
本文最后采用的数值是:
    STR476    消耗数763225203(7亿多),大约消耗29小时。
最重要的是:可以挂机。用连发手柄+压住按钮来挂机,基本不用人工控制。

lv30 STR 476 +技能256 +升级690 +蛋440 +血140 = 最终STR 2002!
人物ATK=(2002+7800)*1.3 = 12742


基础伤害 = 人物ATK*支援效果1.5倍*Trust修正 - 敌RDM*削弱抗力
实际伤害 = 基础伤害*招式修正*决技顺序修正*(1+hits数/100)*魔法元素相克修正

关于公式说明:
·支援。就是指加攻击力的魔法、或者力量药,只有一个有效。
·Trust。游戏显示的Trust是一个评估值,不参与实际计算。实际有一个隐藏Trust因子,就是完全伤害率。比如フレイ的最终武器显示Trust只有3,但是完全伤害率有30%。打出完全伤害的可能性非常高了。如果武器只有常规意义上的Trust因子,那斩神剑等肯定用起来非常郁闷,但实际上因为有完全伤害率存在,所以还很不错。
·消弱抗力,是敌人对Reduce Guard的抗力。抵抗力值是敌人的固有属性,与我方的魔力无关。
·魔法元素相克修正。フレイ的决定技エーテルストライク算毒魔法。这个经过分析过游戏的数据而验证。至于这么设定的原因不清楚。总之魔法对于有对应弱点的敌人伤害加倍。这是之所以フレイ能能打出这样大伤害数字的原因。其他人的决定技就没有这种特性。
(至于武器与敌人的隐藏属性数据是从游戏中分析出的,以后这些资料会一并整理在北欧专题站上面)

敌人选用位于SG第三区有毒弱点、且RDM最低的Wise Sorcerer,RDM30, 消弱抗力68.25%
基础伤害 = 12742*1.5*1 - 30*0.6825 = 19093
对于有毒弱点的敌人伤害公式 = 基础伤害 * 20 * 1 * 1.99 * 2 = 基础伤害*79.6 = 19093 * 79.6 = 1519802.8

实际打出的成绩也是 1519802。这个数字是确定的,没有随机成分。
这种队伍打99hits比较难连。需要用不死王的伪决。稍有点失误就到不了99了。



其他人的成绩:
“RPG史上最高一击”录像作者code1484,他的成绩是:(2002年)
最终STR1964 伤害 1493269
http://www10.plala.or.jp/code1484/game/vp.htm

よっつんヘイム的成绩是:(2004年)
最终STR1989 伤害 1517732
http://www.geocities.jp/yosimake2000/yottunheimu.html

虽然成绩只比日站的提高了2000余点,但伤害最大值这个数字是确定的,取决于人物的STR。这就是目前为止的最高一击伤害。