コードはRubyっぽく書いてます。書き方がフラフラしててすいません。
概要: PS2版DQ5の乱数は、Mersenne Twisterで実装されている。乱数の状態をメモリから取り出してMTをシミュレーションすれば簡単に無限に回転表を作れる(はず)んだから、そこからなんとかして現在地を特定すればノーリセでカジノ技できるんじゃね? というお話。
100C | 10C(左端) = 1C(左から2番目) |
10C(左から2番目) = 1C(左端) |
10C(左から3番目) = 1C(左から4番目) |
10C(左から4番目) = 1C(左から3番目) |
||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
出目表(1万回転まで) | 100c-10k.txt | 10c1-10k.txt | 10c2-10k.txt | 10c3-10k.txt | 10c4-10k.txt | |||||||||||||||||||||
乱数 mod 16と出目の対応 | 0 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
1 | 5 | 3 | 2 | 5 | 4 | 7 | 7 | 7 | 7 | 7 | 6 | 4 | 3 | 5 | 4 | 3 | 6 | 2 | 4 | 6 | 3 | 4 | 3 | 2 | 3 | |
2 | 5 | 5 | 2 | 4 | 4 | 3 | 3 | 5 | 3 | 6 | 2 | 5 | 4 | 4 | 6 | 2 | 4 | 4 | 2 | 2 | 2 | 3 | 5 | 4 | 2 | |
3 | 5 | 2 | 3 | 3 | 3 | 2 | 2 | 4 | 5 | 2 | 4 | 2 | 2 | 2 | 2 | 4 | 2 | 2 | 6 | 4 | 4 | 2 | 3 | 2 | 5 | |
4 | 4 | 3 | 2 | 5 | 4 | 2 | 3 | 2 | 2 | 5 | 6 | 6 | 7 | 5 | 6 | 2 | 3 | 3 | 2 | 2 | 3 | 3 | 4 | 3 | 2 | |
5 | 5 | 3 | 2 | 2 | 2 | 5 | 3 | 4 | 6 | 6 | 7 | 2 | 4 | 3 | 3 | 6 | 5 | 2 | 4 | 3 | 2 | 2 | 2 | 4 | 6 | |
6 | 5 | 2 | 2 | 4 | 4 | 2 | 4 | 4 | 5 | 6 | 4 | 5 | 5 | 5 | 2 | 5 | 2 | 5 | 3 | 4 | 3 | 6 | 6 | 2 | 3 | |
7 | 3 | 3 | 6 | 6 | 4 | 4 | 3 | 4 | 5 | 2 | 6 | 3 | 3 | 2 | 3 | 3 | 6 | 2 | 3 | 5 | 5 | 2 | 5 | 3 | 2 | |
8 | 2 | 6 | 3 | 3 | 4 | 2 | 3 | 7 | 2 | 6 | 5 | 5 | 2 | 4 | 6 | 2 | 2 | 4 | 2 | 3 | 4 | 3 | 2 | 4 | 7 | |
9 | 5 | 3 | 2 | 2 | 5 | 2 | 3 | 4 | 5 | 4 | 3 | 2 | 4 | 5 | 3 | 4 | 3 | 2 | 5 | 4 | 2 | 2 | 3 | 2 | 3 | |
A | 6 | 5 | 4 | 4 | 6 | 2 | 5 | 6 | 2 | 2 | 6 | 4 | 6 | 3 | 5 | 3 | 4 | 3 | 3 | 5 | 3 | 5 | 4 | 5 | 2 | |
B | 5 | 3 | 3 | 3 | 4 | 3 | 3 | 2 | 4 | 6 | 4 | 5 | 2 | 2 | 6 | 2 | 5 | 6 | 2 | 4 | 2 | 4 | 2 | 3 | 4 | |
C | 5 | 3 | 5 | 5 | 2 | 2 | 6 | 4 | 5 | 3 | 7 | 2 | 6 | 5 | 2 | 5 | 3 | 4 | 5 | 2 | 6 | 2 | 6 | 6 | 3 | |
D | 3 | 4 | 3 | 3 | 3 | 6 | 3 | 4 | 5 | 2 | 6 | 3 | 4 | 6 | 4 | 6 | 4 | 6 | 2 | 6 | 3 | 5 | 2 | 2 | 3 | |
E | 5 | 3 | 4 | 4 | 4 | 4 | 3 | 3 | 2 | 6 | 3 | 5 | 5 | 2 | 6 | 5 | 5 | 3 | 2 | 3 | 2 | 4 | 4 | 3 | 5 | |
F | 4 | 3 | 5 | 5 | 5 | 2 | 2 | 4 | 5 | 2 | 4 | 2 | 4 | 3 | 3 | 4 | 3 | 3 | 4 | 2 | 4 | 3 | 2 | 3 | 2 | |
パターン重複数 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 0 | 0 | 1 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 3 | 2 | |
出現回数 | 7 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 3 | 2 | 2 | 3 | 1 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 |
6(BAR) | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 6 | 5 | 1 | 2 | 1 | 5 | 2 | 2 | 2 | 1 | 2 | 1 | 1 | 2 | 1 | 1 | |
5(スイカ) | 9 | 2 | 2 | 4 | 2 | 1 | 1 | 1 | 7 | 1 | 1 | 5 | 2 | 5 | 1 | 3 | 3 | 1 | 2 | 2 | 1 | 2 | 2 | 1 | 2 | |
4(ベル) | 2 | 1 | 2 | 4 | 8 | 2 | 1 | 8 | 1 | 1 | 4 | 2 | 5 | 2 | 2 | 3 | 3 | 3 | 3 | 4 | 3 | 3 | 3 | 3 | 1 | |
3(プラム) | 2 | 9 | 4 | 4 | 2 | 2 | 9 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 4 | 3 | 4 | 4 | 3 | 3 | 5 | 4 | 3 | 5 | 5 | |
2(チェリー) | 1 | 2 | 6 | 2 | 2 | 8 | 2 | 2 | 4 | 5 | 1 | 5 | 3 | 4 | 3 | 4 | 3 | 5 | 6 | 4 | 5 | 5 | 5 | 5 | 5 |
ターン数 | 馬車外メンバー | ともしびこぞうの行動 | |||
---|---|---|---|---|---|
A | B | C | D | ||
1 | 主人公 | 打撃 | 打撃 | メラ | メラ |
2 | ヘンリー | 打撃 | メラ | 打撃 | メラ |
3 | 主人公・ヘンリー | 集中攻撃対象 | |||
ヘンリー | 主人公 | ヘンリー | 未設定 |
画像が多いため別ページへ。
spd * 0.5 + rand(0.0...spd*0.5) # spd * rand(0.5...1.0)
上に挙げた式では省いているが、PS2版DQ5では0以上x未満の実数乱数を得るとき、以下のようにrand(0, 0xffffff) % (x * 100000).floorを求め、その剰余をまた実数に変換して100000.0で除算するという方法をとっている。
divisor = (x * 100000.0).floor # 除数 rand(0..0xffffff) % divisor / 100000.0 # 0xffffff = 16777215
行動順値計算ではxにspd*0.5が代入される。spdが低いうちはまだいいのだが、問題なのはspdが高いとき。最大でも16777215の被除数に対し除数がかなり大きくなり、その剰余つまり乱数の分布が下に偏ってしまう。分布が一様から最も遠ざかるのはspd224(x=112.0)付近のときか。このときの式の一部を抜き出すとrand(0..16777215) % 11200000とかやっている。ただし分布がいくら偏ろうが乱数の範囲そのものは変化しないため、spd2倍以上で確定先攻という原則が破られることはない。
下の表は行動順シミュレータで100万回試行した結果(「4 vs 3」はspd比が等しく除数が小さい時の比較対象;一様分布とほぼ変わりないことがわかる)。先攻率の差が相当広がる状況を想定したつもりだが、それでも先攻率が理論値から5.5%落ちる程度。ならそう問題視することもない? spdが高くかつ近いときは相手の分布も下に偏りがちだろうし、spdが離れているときは行動順値のとる範囲自体が重なりにくい。
素早さ | 224 vs 168 | 4 vs 3 | |
---|---|---|---|
先攻率 | 一様分布 | 83.34% | 83.30% |
実際の分布 | 77.76% | 83.25% |
打撃ダメージ計算でも実数乱数を求めることがあるが、高spd時の行動順値計算ほどの大きな除数は出てこない。せいぜいがatk/16.0*100000.0程度。
行動順シミュレータ詳細版100万回試行結果。素早さの低いほうがまだ一様分布の曲線に近いことがわかると思う。
モンスターの行動スロットには、そのひとつひとつに「同グループ単位で1Tにつき1度しか選択されないフラグ」が設定されている。「賢さ」とはまた別のスロット再抽選要素であり、いわゆる「制限行動」はこれによって実現されている。以下、このフラグを「制限フラグ」、制限フラグの立っているスロットを「制限スロット」と呼ぶ(恐らく複数行動不可フラグと同じモノだが、ちょっと長いのでこう呼び替えさせてもらいました)。また、制限スロットの行動は"*"つきで表す。
行動確率の計算表はかなり大きいため別途Googleシートに示す。ここで挙げたモンスター以外の制限スロットを知りたい方はPS版DQ5 モンスターデータをご参照ください。
攻撃 | *火炎 | 攻撃 | *火炎 | *様子 | 攻撃 | |
---|---|---|---|---|---|---|
重み | 1 | 1 | 1 | 1 | 1 | 1 |
分布 | 16.67% | 16.67% | 16.67% | 16.67% | 16.67% | 16.67% |
既によく知られている「火炎の息≦2回/T」は火炎スロット2個とも制限スロットであるため。「様子を見る≦1回/T」も唯一の様子スロットが制限スロットであるため。
溶岩原人3匹のとき、火炎0:27.67%、火炎1:55.00%、火炎2:17.33%となる。ついでに火炎2+隊列4/4打撃は、火炎2+打撃:12.33% * 1/10 = 1.23%となる。
攻撃 | *メラ | 攻撃 | メラ | 攻撃 | 攻撃 | |
---|---|---|---|---|---|---|
重み | 68 | 58 | 48 | 38 | 27 | 17 |
分布 | 26.56% | 22.66% | 18.75% | 14.88% | 10.55% | 6.64% |
溶岩原人の火炎の息は2スロットとも制限スロットだったのに対し、ホースデビルのメラミは制限・非制限スロットが混在している。行動の制限は行動種別単位ではなくスロット単位で行われるため、スロット2選択後はスロット4のほうだけ残ってメラミ選択率が低下するのに対し、スロット4選択後はスロット2,4ともに残るため選択率はそのまま据え置きになる。このようにスロット次第でその後のメラミ選択率が変化するものの、ホースデビルの唱えたメラミがどちらのスロット由来なのか判別する方法はない。
3匹グループの場合、メラ0:24.41%、メラ1:52.48%、メラ2:20.80%、メラ3:2.31%となる。ホースデビルのメラミに似たパターンに、ブリザードマン(凍える吹雪:*凍える吹雪:攻撃:攻撃:*ヒャダルコ:攻撃 = 1:1:1:1:1:1)の吹雪などがある。
*激炎 | マホ | 攻撃 | *メラ | 攻撃 | *メラ | |
---|---|---|---|---|---|---|
重み | 1 | 1 | 1 | 1 | 1 | 1 |
分布 | 16.67% | 16.67% | 16.67% | 16.67% | 16.67% | 16.67% |
制限フラグは2匹以上のグループだけに適用されるものではない。1匹グループであっても、そのモンスターが2回行動するならその2回目の行動に適用される。2回行動のあるボスはブオーンとミルド2とエスタークを除き、制限フラグによってなにかしら行動の制約を受けている。ゲマ1もそのうちのひとつ。
激しい炎は24.44%で≦1回/T。メラゾーマはスロット2個とも制限スロットであるため、メラ1:42.22%に対しメラ2:3.33%とかなり落ちる。また、マホカンタ状態だと賢さ2のゲマ1はマホカンタのスロットを除外するため、激しい炎:29.00%、メラ1:48.00%、メラ2:5.00%と全体的に確率が上昇する。
2回行動の合間にマホカンタが解けたり、メラが選択されない味方単騎マホカンタ状態の行動確率はめんどいのでなし。
*助け | 攻撃 | *助け | 攻撃 | 攻撃 | 攻撃 | |
---|---|---|---|---|---|---|
重み | - | - | - | - | - | - |
分布 | *助け→攻撃→*助け→攻撃→攻撃→攻撃 |
最後にローテーション行動を行うモンスターが影響を受ける例を挙げる。トンネラー2匹グループ時の1T目からの行動を以下に示す(テーブル書くのめんどい):
# 0:攻撃、1:助け A 10100010100010100010 B 01000101000101000101
1T目にBの方がスロット1を飛ばされているのがわかる。前述したように行動はスロット単位で制限されるため、Aに取られたスロット1をBは選択できない。このときBは再抽選ではなくローテ上の次のスロットであるスロット2を選ぶ。1T目にBのローテーションがズラされたことにより、その後は制限スロットが重なることなく安定してローテーションが回る。なおこいつは賢さ0なのでモンスターを呼べない状況でも構わず「助けを呼ぶ」を行う。そのため仲間呼びスペース不足によるローテーション崩れは起きない。行動パターンが同じ「ローテーションA」でも賢さ2のマドハンド(仲間(ゴーレム)→仲間→仲間→攻撃→仲間(ゴーレム)→攻撃)ならまたややこしい行動をとるかもしれない。
制限フラグが設定されているスロットは驚くほど多いが、同時にそれが死にステと化しているモンスターも多い。単体のグループでしか出現しないデッドエンペラーの「いかづちの杖」然り、ゴンズさんの「武器を振り回す」然り・・・
基本値 = (atk - def/2.0) / 2.0
種類 | 条件 | 計算式 | |
---|---|---|---|
通常攻撃 | 式1 | 基本値 > 0.5 && 基本値 > atk/16.0 && atk > def/2.0 | 基本値 + rand(0.0...基本値/8.0) - 基本値/16.0 + rand(0.0...2.0) - 1.0 |
式2 | 基本値 > 0.5 | rand(0.0...atk/16.0) | |
式3 | 基本値 <= 0.5 | rand(0.0...1.0) < 0.75 ? 1 : 0 | |
会心の一撃 | (1/64) | (atk * (rand(95...105) / 100.0) + 0.5).floor | |
魔神の金槌 | (1/2) | (atk * (rand(95...106) / 100.0) + 0.5).floor | |
痛恨の一撃 | (1/4) | (atk + rand(0...atk/20) + 0.5).floor |
省略やはったりもあるがだいたいこんな感じ。式1〜3はこの後にも属性武器やバイキルト等の計算が続く。会心・魔槌・痛恨はこのままのダメージが出る。
base = mhp * 0.85 incr = mhp * rand(0.0...0.15) hp = (base + incr + 0.5).floor # (mhp * rand(0.85...1.0)).round
下限は(mhp * 0.85).round。一様分布ではない。
メタルスライム(mhp5)の初期HPが4である確率は、それをpとおいて 5 * (0.85+0.15p) + 0.5 < 5 を解き、0 <= p < 1/3 より1/3。はぐれメタル、メタルキングについても同様に求められる。
mhp | 不等式 | 解 | 初期HP分布 | ||
---|---|---|---|---|---|
mhp-1 | mhp | ||||
メタルスライム | 5 | mhp * (0.85+0.15p) + 0.5 < mhp | 0 <= p < 1/3 | 33.33% | 66.67% |
はぐれメタル | 6 | 0 <= p < 4/9 | 44.44% | 55.56% | |
メタルキング | 7 | 0 <= p < 11/21 | 52.38% | 47.62% |
生存人数 | 1列目 | 2列目 | 3列目 | 4列目 | |
---|---|---|---|---|---|
4人 | 重み | 8 | 6 | 4 | 2 |
分布 | 40.00% | 30.00% | 20.00% | 10.00% | |
3人 | 重み | 8 | 6 | 4 | - |
分布 | 44.44% | 33.33% | 22.22% | - | |
2人 | 重み | 8 | 6 | - | - |
分布 | 57.14% | 42.86% | - | - |
呪文のほうはどうやら等確率らしい。
成功率に関わるのは全体/個人逃げ問わず「にげる」の試行回数のみ、確定逃げなし。まあ月並みな結果。
試行回数 | 1 | 2 | 3 | 4〜 |
---|---|---|---|---|
成功率 | 1/2 | 1/2 | 3/4 | 7/8 |
分布 | 50.00% | 25.00% | 18.75% | 6.25% |
行動 | ホイミ | 攻撃 | ルカナン | ギラ | マヌーサ | |
---|---|---|---|---|---|---|
重み | 200 | 40+3 | 8 | 4 | 1 | |
分布 | 基本 | 78.13% | 16.80% | 3.13% | 1.56% | 0.39% |
ホイミ対象なし | - | 94.92% | 3.13% | 1.56% | 0.39% | |
ルカナン対象なし | 78.13% | 16.80% | - | 4.69% | 0.39% |
雪の女王(atk50)の力ため打撃がベラ(def31)に命中した場合のダメージ分布(シミュレータ100万回試行):
ダメージ | 確率 |
---|---|
30 | 0.16% |
31 | 0.18% |
32 | 2.60% |
33 | 2.57% |
34 | 7.37% |
35 | 7.44% |
36 | 10.82% |
37 | 10.70% |
38 | 11.48% |
39 | 11.44% |
40 | 9.02% |
41 | 9.03% |
42 | 6.63% |
43 | 4.25% |
44 | 4.24% |
45 | 0.83% |
46 | 0.83% |
47 | 0.42% |
平均 | 38.3086 |
範囲 | 30..47 |
38以上 | 58.17% |
計算に必要な他のパラメータは、
以上より、雪の女王の力ため直後のターンにHPまんたんのベラが死ぬ確率が求められる。
1/2 * 2/9 * 5/6 * 58.17% = 5.39%
これはひどい。ぼくとか即死率が5割を超えてるとは思わなかったですね。
攻撃\対象 | 人間 | 仲間モンスター(耐性別) | |||
---|---|---|---|---|---|
無 | 弱 | 強 | 完全 | ||
マホトラ | 100 | 100 | 80 | 33 | 0 |
ルカニ | 100 | 100 | 64 | 10.89 | 0 |
メガンテ | 100 | 50 | 35 | 15 | 0 |
ラリホーマ | 75 | 100 | 100 | 66 | 0 |
ルカナン | 70 | 100 | 64 | 10.89 | 0 |
マヌーサ 砂煙 | 62.5 | 50 | 35 | 15 | 0 |
ザキ ザラキ マホトーン ラリホー 甘い息 おたけび 毒の息 | 37.5 | 50 | 35 | 15 | 0 |
メダパニ | 25 | 50 | 35 | 15 | 0 |
焼け付く息 | 12.5 | 50 | 35 | 15 | 0 |
装備 | 倍率 | 効果対象 | |
---|---|---|---|
状態変化 | 攻撃 | ||
エルフのお守り | 1/4 |
即死 マヒ 不気味な光 眠り 呪文封じ 混乱 | - |
黄金のティアラ | 1/2 | ||
メタルキングの盾 | 1/2 |
即死 混乱 |
マヌーサ ラリホー ラリホーマ |
天使のレオタード | 1/2 | 即死 | - |
敵に対する状態変化成功率は恐らく全てマホトラと同じ(ラリホーマのみ[その倍, 100%].minか)だが、味方に対する状態変化成功率は攻撃によって異なる。
判定処理の疑似コード。謎の分岐により成功率は「基本成功率 * 特殊装備倍率」よりもコンマ数%だけ高くなるが、無視してよい。
def hit_state? rnd = rand(0..0xffffff) % 1000 limit = (基本成功率 * 特殊装備倍率 * 10).floor # 乱数に0x10のビットが立っていると条件を反転(なぜ?) if rnd & 0x10 != 0 1000 - limit < rnd else rnd < limit end end
行動回数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
マヒ | 解除率 | 0 | 0 | 0 | 0 | 1/8 | 3/8 | 5/8 | 1 | 1 | 1 | 6.63 |
分布 | 0.00% | 0.00% | 0.00% | 0.00% | 12.50% | 32.81% | 34.18% | 20.51% | 0.00% | 0.00% | ||
眠り | 解除率 | 0 | 3/8 | 5/8 | 7/8 | 1 | 1 | 1 | 1 | 1 | 1 | 2.89 |
分布 | 0.00% | 37.50% | 39.06% | 20.51% | 2.93% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | ||
マヌーサ | 解除率 | 0 | 0 | 0 | 0 | 3/8 | 5/8 | 7/8 | 1 | 1 | 1 | 5.89 |
分布 | 0.00% | 0.00% | 0.00% | 0.00% | 37.50% | 39.06% | 20.51% | 2.93% | 0.00% | 0.00% | ||
マホトーン | 解除率 | 0 | 0 | 0 | 0 | 0 | 0 | 5/8 | 6/8 | 7/8 | 1 | 7.48 |
分布 | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 62.50% | 28.13% | 8.20% | 1.17% | ||
メダパニ | 解除率 | 0 | 0 | 0 | 0 | 0 | 1/8 | 3/8 | 5/8 | 1 | 1 | 7.63 |
分布 | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 12.50% | 32.81% | 34.18% | 20.51% | 0.00% | ||
マホカンタ | 解除率 | 0 | 0 | 0 | 0 | 0 | 5/8 | 6/8 | 7/8 | 1 | 1 | 6.48 |
分布 | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 62.50% | 28.13% | 8.20% | 1.17% | 0.00% | ||
眩しい光 | 解除率 | 4/8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1.5 |
分布 | 50.00% | 50.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% | 0.00% |