Top攻略・調査 > 煉獄乱数調査の記録1

煉獄乱数調査の記録1

 このページでは私が実際に煉獄で乱数を調査した時の記録を元に、どのように考えて調査をしていったかの過程を書こうと思います。調査の結果は「煉獄乱数調査(結果)」に書いた情報が全てですので、こちらのページはただの読み物という扱いです。 興味のある方は少ないかと思いますが、私の中ではこれまでに自分がやった調査の中で一番ロマンシングなものだったと思っています。 よく考えるとこのサイトを立ち上げた目的もこの記事を載せるためでした。 よくもまぁ先延ばしにしてきたもんです。 忘れる前に是非とも書きとめておかなければいけません。
 尚、その乱数から財宝の決定される規則を解明した過程についてはここには書きません。 (早い話が当てずっぽうの試行錯誤の連続でしたので文章としてまとめる自信も無いですし、既にかなり忘れている部分もありますからこれについてはこれからも執筆する予定はありません。)
 あと、調査の性質上、数字が苦手な方には辛い内容になってしまっております。m(_ _)m

煉獄乱数調査を思い立った理由

 そもそもは財宝のPP発掘の調査をしていました。 その財宝は乱数で決まっています。 乱数とは財宝などにランダム性を持たせるためにプログラムの内部で使われている
・
・
3830989
660358
14878283
9988652
4751097
2478146
10201687
7990088
・
・
のような一見デタラメな数の列です。(ちなみに上の数の列はミンサガで実際に使われているものです。もちろん当時は知りませんでしたが。)
 その当時あまりやられていなかった財宝のサブアイテムの調査をしている内に、乱数から財宝が決まる規則に興味を持つようになりました。
 さらに、各ランクでの色付き財宝の出土確率はwar of side様に記載されていますので、 プログラム内部で使われている乱数を手に入れることが出来ればPP発掘で掘れるはずのものが全て予想できるのではないか、 と思ったわけです。
 この「乱数を手に入れる」ことが煉獄乱数調査の目的でした。 なぜ、乱数入手の方法としてPP発掘ではなく煉獄を選んだかといいますと、
PP発掘では
・乱数から発掘品を決める法則は複雑だと思われるので、発掘品から乱数を復元するのは非常に難しい
・一回のリセット&ロードにつき、一組の金額・アイテム・サブアイテム等のデータしか得られない
という問題がありますが、
煉獄のルーレットでは
・乱数から行き先階の数字を決める規則は非常に簡単かもしれない(これに賭けてました)
・この規則によってはいろんな階でデータ(行き先階の数字)を記録すれば乱数が復元できるかもしれない
・一回のルーレットを録画すればデータがどんどん得られる
・なのでデータの順番の情報もはっきりわかる(乱数生成の規則を求める上で非常に重要です)
というメリットが考えられました。
 もちろん煉獄のルーレットと財宝に別の乱数を使っている可能性もありました。 当然、その場合はおじゃんです。これも全くの賭けでした。
 また、ある程度複雑な乱数を使っていたら、乱数の一部を手に入れることはできてもそこから乱数を生成する規則が わからなければ乱数を全て手に入れることはできません。 これについてはwar of side様に記載されている確率が不自然だったこと、他ゲームで偶奇偶奇偶奇・・という乱数が使われている記事があったことから、ミンサガでもおそらく偶奇偶奇・・となる単純な乱数が使われているだろうと思っていました。
 などなど、不確定要素を多分に含みながら、私は成功する保証の全く無い煉獄乱数調査に向かったわけです。

煉獄36階での調査

煉獄に行って、まず、煉獄1階でルーレットの数字を何回も記録しました。 方法はPP発掘とほぼ同じで、フロアの敵を全て消し、フロアから出る直前でQSして、 ロード後の方向キー入力でルーレットスタートです。
 この段階でルーレットの数字の出方はある程度の再現性があるが毎回同じではないことなどがわかりました。
 次に、階を変えました。
例えば煉獄1階では次に行ける階は2階から99階ですから、表示される数字は「1〜98階先」の98通りです。  実際に調査を行った時、1階の次に行ったのが煉獄36階でした。表示される数字は「1〜63階先」の63通りです。
36階を選んだ理由は、98が7の倍数だったので、後(調査記録2)で述べるような理由から99-36=63が7の倍数になってほしくて、 その条件でたまたま最初に行けたのが36階だっただけです。結果から言いますと選んだ理由は間違いでしたが、 36階を選んだという事実は非常にラッキーでした。
 実際に36階のルーレットで出てきた行き先階のデータ(一回分)は下のようになりました。
57  8 35 58 61 28  7 46 42 45 12 55 30 49 32 27 18 53 52 63  6
57  8 35 58 61 28  7 46  1 48 43 34  5  4 15 22  9 24 51 10  6
57  8 35 58 61 28  7 46  1 48 43 34  5  4 15 22  9 24 51 10 13 44
23 62 17  1 59 50 21 20 31 38 25 40  3 26 29 60 39 14 33 16 11
 2 37 36 47 54 41 56 19 42 45 12 55 30 49 32 60 39 14 33 16 11
 2 37 36 47 54 41 56 19 42 45 12 55 30 49 32 27 18 53 52 63  6 
57  8 35 58 61 28  7 46  1 48 43 34  5  4 15 22  9 24 51 10 13 44
23 62 17  1 59 50 21 20 31 38 25 40  3 15 22  9 24 51 10 13 44
23 35 58 61 28  7 46  1 48 43 ・・・
驚いたことに、およそ周期21ぐらいで同じパターンが何度も出てきました。しかし、完全にパターンが繰り返すわけでもないようです。
 また赤字で書いた所以外は偶数と奇数が交互に出ていることがわかります。 よくよく見るとその赤字を境にパターンが一致し始めたり、また一致しなくなったりしているのがわかります。

 これは次のように考えると納得が行きます。まず、
・本当は偶奇偶奇偶奇偶奇・・・となるはずだが、赤字のところで乱数がとんでいる。
試しに赤字の所を避けて乱数が飛んでいない部分だけ繋いで見ると本来のパターンが見えてきます。
59 50 21 20 31 38 25 40  3 26 29 60 39 14 33 16 11  2 37 36  (一行20個で書いてます)
47 54 41 56 19 42 45 12 55 30 49 32 27 18 53 52 63  6 57  8
35 58 61 28  7 46  1 48 43 34  5  4 15 22  9 24 51 10 13 44
23 62 17 1(0) 59 50 ・・・(繰り返し)
長さ64の周期が見えてきました。上で現れたおよそ21ぐらいの周期というのは偽りの周期。64が本当の周期です。
 ただし、17の直後、59の直前の1は0に直してます。2〜63までの他の数字はちょうど一回ずつ出てきてるのに1だけ2回出てくるのは変ですし、 乱数がここだけ同じところで奇数三連続というのも怪しいです。これだけだとあまり根拠が無いようですが、次に書く「線形合同法」について下調べしてあったため、実はもうほとんど結果の予測がついてましたから自信を持ってやってます。
 では次に元のデータに戻り、乱数が飛ぶところに注目してみましょう。つまり赤字の前後
46→42、10→6、32→60、3→15、23→35
の部分です。これを並び替え後にみると全て20個前(=44個後)の数(上のように書くと一行上になります)に飛んでいることがわかります。
 これはいろいろ考えると、次のように解釈した方が、より自然です。
つまり、本当の乱数の順番は
59 28 41 50  7 56 21 46 19 20  1 42 31 48 45 38 43 12 25 34
55 40  5 30  3  4 49 26 15 32 29 22 27 60  9 18 39 24 53 14
51 52 33 10 63 16 13  6 11 44 57  2 23  8 37 62 35 36 17 58
47  0 61 54 59 28 ・・・(繰り返し)
のようになっていて、煉獄のルーレットはこれを基本的に二つ飛ばしで使っている(オレンジ字のように)。 そして、時々何らかの原因で(実は未だに原因がわかってませんが)三つ飛ばしで使っている(青字のように)。 およそ21ぐらいの見せ掛けの周期というのは本当の周期64を二つ飛ばしで使ってたからっだったんですね。(64÷3=約21)

 それでは、ようやくこの乱数を作り出している規則について考えて見ましょう。
 さて、先ほどもう言っちゃいまして今更な感じですが、「長さ64の周期で繰り返す」「偶奇偶奇偶奇・・を繰り返す」「一周期に0〜63までの数がちょうど一回ずつ出てくる」。この条件を全て満たすものに、「線形合同法」という乱数生成のアルゴリズムがありまして、計算機で乱数を生成するときによく使われています。
 そのアルゴリズムは非常に単純で、今の場合(周期64の場合)式で書くと
Xn+1 = A×Xn+B (mod 64)
となります。a(mod 64)というのはaを64で割った余りのことです。Bだけでなく"="の右側全体を割った余りです。
つまり、直前に発生した乱数XnにAを掛けてBを足して64で割ったものを次の乱数Xn+1にする。 これだけです。これをどんどん繰り返すと乱数の列をどんどん作り出すことができるわけです。
 式に出てくるAやBは0〜63までのある整数です。
この数は何でも良いわけではなくてある程度条件がありますが、一通りではないです。
実際にプログラムで使われているAやBを知ることができれば、乱数を全て予測できるようになります。
 では、AとBを計算によって求めていきましょう。
 少々難しくなりますが、上の式を使ってちょっと計算してみましょう。
Xn+2 - Xn+1 =(A×Xn+1 + B) - (A×Xn + B)   (mod 64)
          =A×(Xn+1 - Xn)                 (mod 64)
 なんとBを消すことに成功しました。これを使って先にAを求めてしまいましょう。 乱数の最初の3つの数は59,28,41でしたから、これをXn,Xn+1,Xn+2と思うと、上の式は
41 - 28 = A×(28-59) (mod 64)
 ⇒ 13 = A×(-31) (mod 64)
 ⇒ 13 = A×(33) (mod 64)
途中で負の数「-31」が出てますが、64で割った余りのみ気にしてますので、64を足して33にしちゃっていいんです。
これを満たす0〜63の整数Aを求めます。工夫すれば筆算でもできますが、計算機で全部試すのが楽です。
答えは「A=45」。実はこれ一つしかありませんのでこれで確定です。
 後は、最初の式に戻ってちょっと変形してやりますと、
B = Xn+1 - A×Xn (mod 64)
 ↓
B = 28 - 45×59  (mod 64)
  = -2627        (mod 64)
  = 61           (mod 64)
「A=45,B=61」が分かりました。これを使って実際に59から順に計算してみますと、 59,28,41,50,7,56,21,46,19,20,... となり、ちゃんと同じ乱数になっていることがわかります。
「A=45,B=61」を求めるのには、59,28,41の3つ数しか使っていないことに注意してください。
このおかげで後で随分楽ができるんです。

まとめと次回予告

 煉獄36階の調査によって、
・煉獄のルーレットを支配している乱数は「線形合同法」によって決められている
・煉獄36階では乱数を64で割った余りが表示される(0は1に変更される)
・⇒おそらく煉獄n階では乱数を(100-n)で割った余りが表示される(同じく0は1に)
ことがわかりました。

 あれ、どうしてそういう結論になるのか、さっき乱数を全部求めたじゃないか、 と疑問に思われた方がほとんどでしょう。
実は煉獄36階で見えているのは実際の乱数の氷山の一角なんです。
財宝や煉獄のルーレットを実際に支配している式は
Xn=12996205*Xn-1+123453 (mod 16777216)
というなかなか巨大な式です。(数が巨大なだけで形は同じですが。)
煉獄36階では16777216=224が、64=26で割り切れるため、 今回説明したようなきれいな結果になってます。
巨大な式を64で割った余りだけなら今回求めたミニチュアの式で計算できるというわけです。
余談ですが、この辺りが私がよく言っている乱数の周期性の原因です。
64以外でも8など、 「2の○乗」で書ける数で割った余りには周期性が出てきます。周期はその数自身です。
乱数が「偶奇偶奇偶奇・・・」となるのが一番単純なケースです。


「煉獄乱数調査2」ではいよいよこの巨大な式を求めていく過程を書いていこうと思います。
基本は今回と同じですが、36階以外のいろいろな階で調査しつつ、あと二、三の工夫が必要になります。
例によっていつになるかはわかりませんが、いつかは書こうと思います。




読んでくれる人がいなくとも!
Top攻略・調査 > 煉獄乱数調査の記録1

inserted by FC2 system