2016年12月6日火曜日

SM孵化の乱数列生成アルゴリズムについて

はじめに

これはPokémon RNG Advent Calendar 2016の6日目の記事です.ここ数日でSM孵化の仕組みの検証が進み,乱数列生成方法についても解明に至ったのでまとめます.SM孵化の仕組みについてはろいしん氏のSM孵化仕組み検証 を読んで下さい.

乱数列生成アルゴリズムについて

oupo氏の助けもあり,ぽけりんのBBSへの書き込みと,ポケットモンスターサンの説明書から乱数列生成アルゴリズムにはTiny MTが使われていることがわかりました.
Tiny MTにはmat1, mat2, tmatの3つのパラメータがありますが,それぞれ0x8f7011ee, 0xfc78ff1f, 0x3793fdffだとわかりました.これはTiny MTのsample.cのものと同じです.
実際に使われる乱数はTiny MTの127bitの内部状態に調律を施した32bitの値が使われます.Tiny MTの発明者の実装において関数tinymt32_temperの返り値がこれにあたります.実際にBBSへの書き込みにある性格値などを生成することを確認しました.
確認に用いたソースコードはこちらにあります.
さき氏がBBSの書き込みを表にまとめました.破棄0の遺伝箇所あ合ってないのはコピペミス?

SM孵化の乱数調整に向けて

乱数調整を行うには
  • 現在のseedの確認方法の確立
  • 乱数列生成アルゴリズムの解明
  • スキームの解明
  • 効率的な乱数消費法
が必要になります. 今回Tiny MTが乱数列生成アルゴリズムだとわかりました.また孵化のスキームもろいしん氏の検証により解明されつつあります.
現時点では乱数を消費する方法は受取拒否しか見つかっていません.数十のオーダ以上で消費すること考えると非現実的でしょう.
追記: 卵を受け取ることでいくつか乱数を消費することが出来るので数十程度のオーダーなら問題になりません.
また現在のseedの確認方法の確立 については,パッチールの受け取りとリセットを繰り返し模様を観察することで,現在のseedを確認出来るようになるかもしれないとの予想はありますが,確証には至ってません.
Tiny MTへの理解が進めば可能になるかもしれませんが,何れにせよ「時間をいじれば簡単にできる」みたいな乱数調整とは異なるので注意が必要です.

0 件のコメント:

コメントを投稿