ろいしんぶろぐ

乱数調整とか

SM孵化仕組み検証

SM孵化の仕組み検証です。

 

巷で騒がれてる噂を否定しているのでしっかり読んでね!

 

この仕組みを利用した色孵化の記事についてはこちら

SM色固定孵化のすすめ - ろいしんぶろぐ

 

 

この記事は Pokémon RNG Advent Calendar 2016 8日目の記事です。

www.adventar.org

 

再現性について

6世代は前のタマゴを受け取る/拒否したときに次のタマゴに使う乱数列が決定されていました。

SMでは,5匹受け取り→リセット→5匹受け取りという手順で全く同じ個体が産まれる,ということでタマゴ受け取りによる乱数列の再決定がなくなった模様。

また,受け取りを拒否しても次以降のタマゴが同じ個体になることがある(※ここ重要。必ず起こるわけではない。)という報告があるので,受け取り拒否に関しても乱数列の再決定はない模様。

 

というわけで前作までの仕組みを踏襲しつつ,受け取り/拒否による乱数列の再決定がなくなったものとして調査を始めました。

 

前作までの仕組みはこちら

BW2  

BW2孵化乱数の仕組みと方法 : ただの雑記byさき

XY  

XY孵化仕組み検証 : ただの雑記byさき

 

(1)コイキング♂×コイキング

f:id:Blastoise_X:20161205134746p:plain

 

結果

f:id:Blastoise_X:20161205144240p:plain

1つ拒否を増やすごとに1つずつ個体値が前にずれる傾向があるので,ここから遺伝箇所決定等を推測すると以下のような並びになっていると考えると矛盾がありません。

f:id:Blastoise_X:20161205144905p:plain

タマゴ破棄による消費について

タマゴ破棄による乱数の消費は1消費と考えて矛盾がありませんでした。

 

遺伝箇所決定手続きについて

遺伝箇所決定手続きとしては前作と同じく,

遺伝箇所決定(HABCDSのどれが遺伝するか)→遺伝親決定(♂親♀親どちらから遺伝するか)を3つの遺伝箇所が決定するまで繰り返すという方法をとっています。

0拒否の列で説明すると,5行目の乱数でAが遺伝することが決まり,6行目の乱数で後親から遺伝することが決まります。次に,7行目の乱数でSが遺伝することが決まり,8行目の乱数で後親から遺伝することが決まる,といった具合です。

 

遺伝の2箇所目以降で既に遺伝することが決まっている箇所が選ばれた場合は,その乱数を破棄して次の乱数を遺伝箇所決定に使うというのも前作と同じです。

例えば0拒否の列で説明すると,8行目の乱数まででA-後,S-後という遺伝がすでに決まっていますが,9行目の乱数はすでに遺伝することが決定されているSに対応しているので,9行目の乱数を破棄して次の10行目の乱数でCが遺伝する,というかたちになっています。

 

前作からの変更点としては,

前作までのHAB⇔先親,CDS⇔後親という対応が

今作からはHBD⇔先親,ACS⇔後親という対応に変わったらしいという点があります。

つまり,前作まではある乱数r[n]が遺伝箇所決定に使われたときにHABのどれかが遺伝するという結果があったときに,同じ乱数r[n]が遺伝親決定に使われたならば必ず先親から遺伝するという結果になっていました。

それが今作ではこの遺伝箇所と遺伝親の対応が変更され,遺伝親決定として乱数値r[n]が評価されたとき「先親」という結果が出たならば同じ乱数値r[n]を遺伝箇所決定として評価すると「HBD」のどれかになる,ということになっています。

(※ちょっと専門的な話。括弧内に書く内容はちょっと難しいので理解できなくても大丈夫です。乱数のn段階評価を行うときに,前作までは乱数×n÷定数という形で乱数の大きさそのものを評価していたのが,今作は乱数modnという形で余りを見るように変更された,と考えるのがよさそう。リストをよくみると個体値が偶数のときは同じ行でHBDのどれか,先親という対応になっていて,個体値が奇数のときはACSのどれか,後親という対応になっています。)

 

基礎個体値決定について

基礎個体値決定も前作と同じく,

遺伝箇所も含めたHABCDSの基礎個体値を連続する6乱数を使って決定し,遺伝箇所で上書きする,という方式がとられています。

0拒否の列で説明すると,11行目の乱数まででA-後,S-後,C-先という遺伝箇所が決定した後,12行目から17行目の乱数を使って8-19-4-31-23-2という基礎個体値がまず決定されます。ここに先に決まっていた遺伝箇所を上書きして,最終的に

8-後-4-先-23-後という個体が産まれます。

(※個体値も乱数mod32で決めているようです。なので,偶数個体値はHBD,先親に対応し,奇数個体値ACS,後親に対応します。)

 

その他の決定項目について

1匹目と2匹目のデータから,1匹目の基礎個体値決定終了から2匹目の遺伝箇所決定開始までに用途不明の乱数消費7つがありました。

この内訳としては,

・性別決定

・性格決定

・特性遺伝決定

・特性決定

・ボール遺伝決定

・色判定用性格値決定

などが考えられますが,それぞれの決定場所,順番はこのデータからでは推測できなかったので,とりあえず仮に遺伝箇所決定開始前に5消費,基礎個体値決定後に2消費としています。ここはまだ情報不足で未確定です。

これを少し調べるために追加の調査を行いました。

 

f:id:Blastoise_X:20161205155611p:plain

f:id:Blastoise_X:20161205161133p:plain

パワー系遺伝親決定について

両親にパワー系アイテムを持たせた場合は遺伝箇所決定前にどちらの親から遺伝するかが決められているとみて問題なさそうです。

 

性格遺伝決定について

両親にかわらずのいしを持たせた場合も遺伝箇所決定前にどちらの親から遺伝するかが決められているとみて問題なさそうです。

また,かわらずのいしを片親のみに持たせた場合に乱数消費数の変動はありません。

 

ボール遺伝について

No.21とNo.22の比較から,遺伝箇所決定開始が同時に起こったときに遺伝したボールが異なるという結果が得られたので,

ボール遺伝は基礎個体値決定後のどこかで決めていると考えてよさそうです。

(これを踏まえてNo.20までのデータを含めた再確認を行いましたが,単純に乱数の偶奇だけでボール遺伝親を決めているのではないようです。もしかしたら遺伝親に偏りがあるのかもしれません。)

 

ちなみにこれまでのデータだけでは29,30行目の個体値がわからないので,次の操作を行いました。

♂親にウェイトを持たせた状態でタマゴをつくり,1個目を受け取る。その後,コイキングを引き取りウェイトを取り上げ,持ち物なし状態にしてからコイキングを預けなおし,次にできたタマゴから産まれる個体の個体値を測定する。

すると以下のようになる。

f:id:Blastoise_X:20161205171155p:plain

産まれた個体が6-20-11-先‐後‐後だったので,望み通り目的の値を知ることができました。

これは「結果を予測したうえで不要な乱数を消費するために必要な手続きを行い,目的の結果を得る」ということで乱数調整に他なりませんね。


あかいいととかわらずのいしを持たせた場合

f:id:Blastoise_X:20161205163211p:plain

通常通り受け取った2匹目と,1個目のタマゴを破棄して受けとった2匹目の個体値が一致していますが,性別が異なっています。

この結果は以下のように考えられます。

f:id:Blastoise_X:20161205163400p:plain

2個のタマゴを連続で受け取った場合,21行目の乱数で1個目のタマゴの基礎個体値の決定が終わり,29行目の乱数から2個目のタマゴの遺伝箇所決定が始まります。

1個目のタマゴを拒否した場合,24行目の乱数で次の1個目のタマゴの基礎個体値の決定が終わり,32行目の乱数から2個目のタマゴの遺伝箇所決定が始まります。

それぞれの2個目のタマゴの生成開始地点が違うため,性別が異なっています。

ところが,それぞれ2個目のタマゴの遺伝箇所決定を見ると,

0拒否のほうは35行目の乱数まででH-後,S-後,C-後という遺伝箇所が決まった後36,37行目の乱数がすでに遺伝が決定しているH,Cに対応しているので破棄されています。

1拒否のほうは37行目の乱数まででS-後,C-後,H-後という遺伝箇所が決まっています。

ここでこの2つを比べると,「37行目の乱数の処理が終わった時点で,H-後,C-後,S-後という遺伝箇所が決まっている」という全く同じ状態になっていることがわかります。

遺伝箇所の重複による乱数の破棄という偶然が3回起こったがために,偶然にも2つの個体が全く同じ状態になっています。

ここからさらに残りの遺伝箇所を決めますが,この2個体は偶然にもスタート地点が揃ってしまったので,残りの遺伝箇所,基礎個体値も全て同じになります。

この現象が,「1つ目のタマゴを拒否すると2~5個目のタマゴから産まれてくる個体が同じになる」という噂の真実です。

赤い糸を用いた孵化では遺伝箇所を5つ決める都合上,どうしても遺伝箇所の重複による破棄が起こりやすいため,同じ個体が産まれる確率が高くなりますが,あくまで「起こりやすい偶然」であって「仕組み上の必然」ではないことを認識してください。

 

ここまででだいたい言いたいことは終わりで,ここからは細かな仕様のチェックになります。

 

(2)コイキング♂×メタモン

f:id:Blastoise_X:20161205170227p:plain

コイキング同士と異なるのはボール遺伝が確定かどうかです。

結果

f:id:Blastoise_X:20161205172227p:plain

f:id:Blastoise_X:20161205172322p:plain

ボール遺伝の判定がないため,基礎個体値決定後の消費が1つ少ないと考えて矛盾がありません。

 

(3)ダダリン×メタモン

 

f:id:Blastoise_X:20161207134556p:plain

 

f:id:Blastoise_X:20161207133032p:plain

性別不明の検証は調査員の都合上別の乱数列を用いて検証したので乱数列が上記と異なりますが,遺伝箇所決定前の乱数消費が1つ少ないと考えて矛盾がありませんでした。

 

 

(4)海外産コイキング♂×日本産コイキング

f:id:Blastoise_X:20161205173225p:plain

f:id:Blastoise_X:20161205173339p:plain

日本産同士のときと比較すると,基礎個体値決定後の消費が6個多いという結果になりました。

これらは色違い判定を満たさなかった場合の性格値の再計算と考えるのが妥当なので,今作の国際孵化は通常より6回分余分に色違いになるチャンスがあります。

つまり,通常の約7倍の確率で色違いが出るということになります。

前作までは色違い確率が約6倍だったので若干多くなりました。

(追記)

その後の調査で最初の1回分の色判定がされていないという推定がなされたので国際孵化の色違い確率は約6倍です。

 

(5)光るお守りがある場合

f:id:Blastoise_X:20161207135735p:plain

f:id:Blastoise_X:20161207135747p:plain

光るお守りによって1個目と2個目のタマゴの受け取りの間に2個の乱数消費がありました。

これは1個目のタマゴの基礎個体値決定後にお守りによる性格値の再計算が2回追加されたためと考えられます。

また,別検証にて光るお守りの有無でボール遺伝が異なったという現象が見られたため,性格値→ボール遺伝の順で判定しているだろうということが考えられます。

(追記)

光るお守りに関しても色違いの確率は約2倍となることが推定されています。

 

まとめ

以上をまとめると,スキームは

(用途不明の2個以下の消費)

性別

性格

(かわらず遺伝判定)

特性

(パワー系遺伝判定)

遺伝箇所決定

基礎個体値決定

暗号化定数

(色違い性格値判定)(国際孵化の場合は6回,光るお守りを持っていると2回,両方だと8回)

ボール遺伝判定

 

・タマゴの受け取り拒否を行うと性別等決定前に1消費

となります。

 

今後の課題としては

・特性が2つあるポケモンでの検証

パッチールを用いた検証

・同種同ボールでボール遺伝判定が起こるか

・光るお守りを所持している場合の検証

などでさらに孵化仕様に対する理解が深まると考えています。

 

だいたい検証が終わりました。

この辺も含めた詳細な仕様については次の記事で

blastoise-x.hatenablog.com

おまけ

(※乱数調整の可能性について)

(※タマゴ受け取り/拒否によって乱数列がリセットされないという仕様上,乱数列に関するかなり多くの情報をゲーム内で得ることができるので,孵化乱数列の生成に使われている疑似乱数生成器の種類がわかればゲームデータの解析等を行わずに現在の乱数列を特定することが可能かもしれません。

そうなれば,どういった操作を行えばどういった個体が産まれるかを予測することができるので,乱数調整が可能になるだろうと予想しています。

不要な乱数を消費する方法がタマゴの受け取りと拒否しか見つかっていないので,皆さんが想像するような,「時間をいじれば簡単にできる」みたいな乱数調整とは異なりますが,広い意味での乱数調整に当たると思います。)

 

(2016/12/07追記)

記事投稿から1日足らずで,使われている乱数生成器と乱数の出力方法が解明されました。

ぽよのーと: SM孵化の乱数列生成アルゴリズムについて

今後,ゲーム内で現在seedを求める方法が確立されれば乱数調整が現実的なものになるかもしれません。

(2016/12/10追記)

 さきさんがゲーム内の情報から現在seedを求める方法を見つけました。

SM孵化乱数列を計算する : ただの雑記byさき

これによって孵化乱数調整が可能になりました。

 

 

 

最後に,調査・検証・考察に尽力していただいた,

くあんさん@quan_dra

やつなさん@sub_827

さきさん@water_blow

に多大なる感謝を述べて終わりとします。