6世代でも固定シンボル乱数に成功しました。


というわけで仕組みとか。
検証中の部分が多いので、常に最新の情報に注意してください。


●仕組み

・乱数列
個体決定に使用する乱数列は5世代まででも使用していたMT。
起動する度に初期シード32bitを決定し乱数列を生成する。
フィールド上ではおおよそ60消費/秒で進み、ステータス画面等でも同様に進む。
スリープにすればさすがに止まりそう。(精度よく止められる気はしないので未確認)
乱数値は剰余ではなく5世代同様、商を用いる形式となっている。
(サンムーンでは剰余を使用)
5世代参考→http://blog.livedoor.jp/x_x_saki_x_x/archives/53962575.html

・初期シード
本体とセーブデータに依存する値にミリ秒を足した値のよう。
セーブし直さずに同じ本体で2回起動すれば、初期シードの差はおおよそ起動時間ミリ秒の差になる。
そのため同じセーブデータを使用すれば、サンムーンと異なり初期シードの範囲を絞り込むことが可能。(ソフトリセットでもOK)
初期シードはタイトル画面でのAボタンを契機として決定されると思われる。
(XYで待機時間を変更して確認、ORASは正確には未検証)
ちなみに本体の時間を変えても関係なく初期シードが変わったので、変えるだけ無駄です。
(本体初期化での挙動は未確認)

・個体決定方法
基本的にサンムーンと同じと考えられる。
3V確定の固定シンボルの場合、
 EC→PID→V箇所→残り個体値→性格
という順であった。
(複数特性ある場合等諸々未確認)


●乱数調整方法検討

現時点で乱数列の確認方法は出現個体の確認しか見つかっていない。
また、出現個体の消費数も毎度1/60秒を合わせられる訳ではないので、多少の幅が出てくる。
そして、野性ポケモンを出現させてわざわざ個体値を完全に特定したとしても、情報量的に32bit全探索の場合は初期シードを完全に特定できるとは限らず、基本的に2匹以上の個体値特定を行うこととなる。
そのため、毎度32bitの初期シードから全探索を行うのは相応の労力が必要となる。
そこで、本体とセーブデータを固定した場合の性質を利用する。

一度起動時刻をメモし、野生ポケモンの個体から初期シードを特定する。
すると、同じ本体とセーブデータを使用する限り起動時刻からおおよその初期シードの値を推定することができる。
その後、捕獲の必要のある初期シードの確認有無で2通りの方法が考えられるので、それぞれのメリットデメリットを挙げてみる。

1.初期シード確認を行わない場合
・メリット
事前に待機時間を計算することになるので、待機時間の管理が楽。
毎度ポケモンを捕獲する必要がない。
・デメリット
試行回数を減らすには起動時刻のミリ秒単位の時間の管理と相応の精度が必要。
(1/60秒の精度が出せたとしても初期シード候補は16-17程度になる)

2.初期シード確認を行う場合
・メリット
待機時間の管理さえできれば調整が比較的容易。
・デメリット
毎度ポケモンを捕獲して初期シードを特定する必要がある。
乱数消費を止めないと目標個体検索中も乱数消費が進むので、待機時間の管理が難しい。

どちらも試してみたが、1.は初期シードを安定しなかったので2.の方で調整することとした。


●やってみた

というわけで、以下実際に固定シンボル乱数を行った手順。
完了までセーブを行わず、同じ本体で実施。

0.準備
以下の作業を行いやすい場所でセーブする。
起動時刻をメモして起動し直し、野性ポケモン2匹を捕獲する。
捕獲したポケモンの個体値から初期シードを32bit全探索し、初期シードを特定する。

以下ループ。

1.初期シード特定
起動時刻をメモして起動し、野性ポケモンを捕獲する。
捕獲したポケモンの個体値から初期シードを検索し、初期シードを特定する。
(高Lvのポケモンであれば1匹でもそのままのステータスだけで特定が可能)

2.個体検索
特定した初期シードから目的の個体を検索する。
検索結果と経過時間から残りの待機時間を計算する。

3.乱数調整
計算した待機時間待機し、ポケモンを出現させる。


●その他

操作統一前は消費数が安定しなかったので、何かしらの操作をすると一時的に消費数が変わるのかもしれない。(未検証)

ループ時の初期シード特定だが、野生ポケモンのLvが低い場合個体値測定にPSSの対戦をするという方法もある。
その場合、通信を切断して終了すると消費数が安定しなかったので、面倒でも降参して終わらせることを推奨する。
また、Lvが低すぎなければ2匹捕まえるという手段もある。
その場合、予め2回ともタイミングを決めておくと初期シード候補の絞り込みがやりやすいかと。
ちなみにタイミングを合わせる場合、水上であまいかおりを使うとよい。
(草むらで使うと群れが出てくるクソ仕様乱数調整しかしないので努力値振りは知りません!


スリープ中に乱数消費が止まるのであれば、起動から一定時間後にスリープして検索諸々を行えば待機時間管理自体はやりやすそう。
(どの程度精度が安定するかは知らない)
サンムーンのQR針的な存在があればいいんだけどね。