ドラゴンクエスト2解析【乱数】

ファミリーコンピュータ版ドラゴンクエスト2の乱数生成について解説しています。筆者が独自に解析した結果なので、間違いが含まれる可能性もあります。

最新の解析情報は日記をご覧ください。

乱数生成の概要

ドラゴンクエスト2の乱数には、CRC が使われています (CRC-XMODEM と呼ばれるもののようです)。JavaScript のソースで表すと、以下のようになります (ある程度解かりやすいように最適化しています)。

    var crc = 0
    function crcUpdate(data)
    {
      crc ^= data << 8
      for (var i = 0; i < 8; ++i) {
        crc <<= 1
        if (crc & 0x10000) {
          crc ^= 0x11021
        }
      }
    }

乱数を求める場合、255 を渡して CRC 値を2回更新します。基本的には下位 8 ビットを使用し、乱数の範囲は 0〜255 ということになります。周期は 32767 で、245 が 127 回、それ以外の値が 128 回出るようです。

なお、他のシリーズでも、ほぼ同様のルーチンで乱数を求めているようです。また、復活の呪文や冒険の書にも、CRC が使われているそうです。

乱数生成シミュレータ

JavaScript を使って、乱数生成をシミュレートします。NEXT ボタンを押すたびに、乱数が1つ進みます。

()

威力算出

ドラゴンクエスト2では、ダメージや HP の回復量を、すべて同じルーチンで算出しています。

まず基準となる値を求めます。これは、呪文や特殊攻撃、道具の場合は固定です。通常攻撃の場合は「攻撃力 − 守備力 ÷ 2」(端数切捨て) となります。

攻撃呪文
行動基準値
ギラ40
ベギラマ50
バギ50
イオナズン130
回復呪文
行動基準値
ホイミ64
ベホイミ128
道具
行動基準値
まどうしのつえ40
いかづちのつえ50
いなずまのけん55
ちからのたて128
やくそう100
いのりのゆびわ44
モンスターの行動
行動基準値
ギラ24
ベギラマ50
イオナズン130
炎(弱)24
炎(中)50
炎(強)140

次に乱数を求めます。この値は、0〜15 の乱数を 16 回求め、その合計に 8 を足したものになります (0〜15 の乱数は、上記のルーチンで求めた乱数の下位 4 ビットを使用して求めます)。乱数の偏りがなければ 8〜248 となりますが、実際には 54〜197 になります。

最終的な威力は、「基準値 × 乱数 ÷ 256」で求められます。

威力分布

JavaApplet を使って、威力の分布をグラフで示します。急ごしらえなのでわかりにくいと思いますが、横に威力、縦に確率を取り、赤がその値が出る確率、緑がその値以上が出る確率となります。ボタンを押すことで、威力の基準値を変えられます。