ポケモンサンムーンでも固定乱数ができそうだと大晦日に聞いてしまったので、
検証で正月どころか3連休まで潰しました。


事の発端はこちら。
http://www.smogon.com/forums/threads/sfmt-rng-in-sun-moon.3591281/


以下、検証結果とか。
検証中の部分が多いので、常に最新の情報に注意してください。


●乱数調整可能性

上記記事には、乱数調整を可能とするための3つの重要な要素のうち、2つが記述されている。
1つ目は、使用する乱数列について。
SFMTを用いて64bitの乱数値を生成しているとのこと。
TinyMTと同様、ライセンスにSFMTの表記あり)

2つ目は、乱数値の調整可能性について。
SFMTの乱数列生成に使われる初期シードが2^32通り。
特定条件(NPC等による消費数抑制)を前提にすれば高々2^32×n(2-3桁程度)通りの総当たりで済む(最重要)ので、
スパコンを使わずとも現実的な時間でSFMTの状態の特定が可能である。
また、総当たりの検索対象としてQRコード画面の針(乱数値%17で決定、他の乱数消費がなし)が使用でき、任意に乱数列を進めることができる。

以上2つの情報を用いて、残り1つの要素である乱数値の使用方法の調査を行った。
以下、調査結果。


●固定シンボル(カプ系)の個体決定方法

V箇所3箇所選択(%6、消費数3~)
 3箇所決定までに重複があった場合、重複がなくなるまで次の乱数値を使用。
 ↓
残り3箇所の個体値決定(%32、消費数3)
 乱数値3つ使用。
 ↓
性格決定(%25、消費数1)
 いつも通り。

他の処理については未確認。
シンクロは少なくとも前後10個以内での最下位bit判定ではなさそう。


●どう調整するか

初期シードの調整方法は現段階では不明。(というか見当もつかない)
そのため、基本的な流れは
 起動→初期シード・乱数列特定→調整→出現
ということになる。

1.起動
初期シード決定タイミングは不明。
ただし、不定数の乱数消費は続きから選択後に行われるようで、
続きから選択後一定時間内にQRスキャンの画面を開けば検索する消費数を限定することができる。
ソフトリセットでも問題はなかった。
(追記)
smogonで初期シードの決定方法が公開されましたが、
あまり初期シード調整は現実的ではなさそうです。

2.初期シード・乱数列特定
QRの針データを元に初期シード・消費数総当たりを行う。
フィールド上で主人公のまばたき以外での消費がない場合、
最速QRスキャン起動でおおよそ430-470程度の消費数となった。
それ以外での消費がある場合はその限りではない。(場所によっては700を超えたりも)

3.調整
基本的にフィールド上での消費に任せるか、QR針での消費かの2択となる。
(それ以外のいい方法がある可能性はある)
フィールド上での消費に任せる場合でも、目標箇所との差分を確かめるために
目標箇所が近づいた時点で一度QR針での消費数確認を行うことをおすすめする。
消費数が多い場合は、一度フィールド上での消費の多い場所に移動して消費するのもあり。

4.出現
個体決定直前でも基本的にまばたき消費等が行われているので、
個体決定のタイミングも調整する必要がある。
基本的におおよそ1/30秒単位での調整を行えればよい。
(少なくとも主人公のまばたきのみで消費が行われる場合はそのはず)


●その他重要情報

1.まばたきについて
主人公のまばたきでの消費数は常に30/sというわけではなく、
まばたきを行うとしばらくはまばたきによる乱数消費が行われなくなるよう。
まばたきは乱数値%128が0の時に行われ、
次の乱数値%3が0のとき2回まばたき、1-2の時1回まばたきを行う。多分。
乱数消費が停止する時間は前者と後者とで異なり、
前者はおよそ41/30秒、後者はおよそ34/30秒となっている。(多少のずれがあるかも→ずれてました)
調整する際に考慮に入れる必要があるので注意。
(追記)
smogonでまばたき処理の詳細が公開されました。
%128と%3の計算の間にインターバルがあるそうです。

2.検索時間について
最重要と書いた初期シードの特定可能性だが、普通に検索すると
PCスペックによっては検索に1時間以上かかることがざらにある。
そこで有効な手段の1つが、予めソート済みの検索結果のデータベースを作成すること。
こことかで使用)
最速QRスキャン起動の430-470あたりの針データベースを作成すれば、
データの作り方にもよるが1TB程度の空き容量とデータベース作成時間を犠牲に
高速に検索できる環境を手に入れることができる。
また、QRスキャン起動を主人公のまばたき直後に限定すれば、
データベース容量を(例によってデータの作り方にもよるが)数十GB単位に抑えることができる。
ただし、主人公のまばたきを見るためにプレイヤーがまばたきできなくなるので注意。
(追記)
続きから選択画面で表示される針が使える模様。
http://blastoise-x.hatenablog.com/entry/SM-RNG-abuse


smogonの情報に少し情報足しただけな感じはある。
とりあえず現段階で検証済なのはここまで。
似たような決定方法であればUBとか他の乱数にも応用できるはず。


~Special Thanks~
一緒に検証を行ってくれた方々に多大なる感謝を。
・ろいしんさん @Blastoise_X
・mizdraさん @mizdra
・おだんさん @poke_odan
・oupoさん @_oupo_
・くあんさん @quan_dra