はじめに
これは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への書き込みにある性格値などを生成することを確認しました.確認に用いたソースコードはこちらにあります.
— さき (@water_blow) 2016年12月6日さき氏がBBSの書き込みを表にまとめました.破棄0の遺伝箇所あ合ってないのはコピペミス?
SM孵化の乱数調整に向けて
乱数調整を行うには- 現在のseedの確認方法の確立
- 乱数列生成アルゴリズムの解明
- スキームの解明
- 効率的な乱数消費法
追記: 卵を受け取ることでいくつか乱数を消費することが出来るので数十程度のオーダーなら問題になりません.
また現在のseedの確認方法の確立
については,パッチールの受け取りとリセットを繰り返し模様を観察することで,現在のseedを確認出来るようになるかもしれないとの予想はありますが,確証には至ってません.Tiny MTへの理解が進めば可能になるかもしれませんが,何れにせよ「時間をいじれば簡単にできる」みたいな乱数調整とは異なるので注意が必要です.