Top攻略・調査 > 煉獄乱数調査(結果)

煉獄乱数調査(結果)

まずはじめに、このページの内容の性質上、読む方の数学、プログラミングの知識を多少仮定した記述になってしまうことをご容赦ください。
煉獄に潜って行き先階のルーレットをビデオに録画し、調べたところ、 この行き先階のルーレットに使われている乱数は以下の式で計算されていることが分かりました。
Xn=12996205*Xn-1+123453 (mod 16777216)
a(mod b)というのはaをbで割った余りのことです。123453だけでなく"="の右側全体を割った余りです。ちなみに16777216=2の24乗です。

さらにその後の調査によって、同じ乱数が財宝関係の処理にも使われていることがわかりました。
つまり、乱数から財宝の中身を決定する規則がわかれば、色付などの各アイテムがどのタイミングで掘れるのか予測することが出来る、というわけです。この方法は実際にかなりの成功をおさめています。

さて、上の式をC言語で実装するならば、
int randx=3830989;

int rand(){
  randx=(randx*12996205+123453) %(1<<24);
  return randx;
}
というような関数をプログラムの各所から呼んでいるということでしょう。(実際はグローバル変数なんて使わないでしょうけど)
上のコード中のrandxの初期値3830989は最速から適当に逆算したものです。実際の初期値はもっと遡るかもしれませんが、まぁ気にしないでいいでしょう。
QS後、タイトルロードの時間で状況が再現されることからすると、 おそらくソフトリセット時か、タイトル画面の最初の方でrandxの値を決まった値(3830989とか)に初期化し、 コンティニューするまで上のrand関数を一秒あたり30回程のペースで無駄打ちしているのでしょう。

上の式について少し考えてみると、Xn-1が偶数ならばXnは必ず奇数、 Xn-1が奇数ならばXnは必ず偶数となることがわかります。
従って、この式から出てくる乱数は偶数、奇数を交互に繰り返します。
実は、同じように、この乱数を4で割った余りは周期4の繰り返しとなり、 8で割った余りは周期8の繰り返しとなり、・・・以下略です。
乱数としては最低レベルです(笑)。(このせいでミンサガにはいろいろな罠があります。 とりあえずわかっていることを雑記の方に載せる予定です。)
ちなみに上のような乱数計算のアルゴリズムを「線形合同法」といいます。 少し改良すると偶奇偶奇偶奇・・・なんてことにはならないのでわりとよく使われているようです。詳しく知りたい方は検索してみてください。

この先執筆中です。
Top攻略・調査 > 煉獄乱数調査(結果)

inserted by FC2 system