読者です 読者をやめる 読者になる 読者になる

ポケモンSM 孵化乱数について

この記事はPokémon RNG Advent Calendar 2016の25日目、つまり最終日の記事です。
www.adventar.org

はじめに

今年も残り僅かとなりました。皆さんいかがお過ごしでしょうか。
ポケモンSMの孵化乱数が実用化され、ここ最近、多くの人が乱数調整に挑戦・成功している次第であります。

実用化に至るまで、多くの方の経験や知恵という名の力が合わさって進展し、そしてここまで来ることが出来ました。

私の役割は、スキーム解明の為に必要なデータを揃えた事だけなので、大したことはないですが、
スキーム解明及び最下位1bit埋めパズルを手伝って頂いた、ろいしん先生とさきさん
私のデータだけでは足りない部分の補足に、やつなさんとつぬさん
そしてアルゴリズムの解明に、おだんぽよさんとoupoさん

本当にありがとうございました。


この記事では、当初はSM孵化乱数のまとめ的なものを書こうかと思っていましたが、
他の人が既に解説記事などを書かれているので、補足や備考に近いものを書いていこうと思います。
個人的には、乱数調整をする上で、どうしても知ってほしい事などを書き連ねていきます。

見て欲しい記事

その前にどうしても見て欲しい、為になる記事をご紹介します。
少しでも読んで頂けたら、乱数調整をする上でも知見を広げることが出来ます。

blastoise-x.hatenablog.com
まずSM孵化乱数の調査関連で最も昔の記事です。どのように個体が生成されているのか判明した経緯などが記されています。
ちなみに、この記事にあるデータは私が集計したデータが元になっています。(頑張った)


blastoise-x.hatenablog.com
そして、この記事で詳しいスキームなどの解説が載っています。
どのように乱数値から性別や特性、ボール遺伝などが決まっているのか分かりやすく書いています。

これから話す内容は、これらの2つの記事の知識が前提となっているので、流し読みでも良いので目を通して下さい。

本題

私が制作した乱数調整ツールについて

SM孵化乱数調整ツールとして、こちらの記事に公開しています。
多くの方にツールを使って頂き、成功報告を聞いています。ありがとうございます。嬉しいです。

ところで、他の方が作成したツールと消費が1ズレたり、TSVはどうやって求めるの?という声をチラホラ耳にします。
まずこの2つについて、先程上記に挙げた記事のスキームを用いて解説します。


おさらいとして、個体生成のスキームはこのようになっています。
ニドラン系や両親に変わらずの石、パワー系アイテムの限定的な消費は除外しています。
基本形ということで。

性別決定(1消費)
※♂♀のみ、性別不明は消費なし

性格決定(1消費)
※変わらずの石を持たせても消費される

特性遺伝決定(1消費)

遺伝箇所決定(不定消費)

基礎個体値決定(6消費)
※遺伝箇所と遺伝親で上書きされる

暗号化定数(1消費)
※特に気にする必要はなし

仮性格値(0消費)

性格値再計算(不定消費)
※お守りで2消費、国際孵化で6消費、両方で8消費されます。消費の数だけ色違い判定を受けます。
色違い判定を満たしたらそこで打ち切り、ボール遺伝か謎消費へ進む。
ここがTSV算出の鍵になります。

ボール遺伝決定(1消費)
同じ種族の時のみ消費。両親が同じボールでも消費。

謎消費(2消費)
※個体処理の前後のどちらかは不明

となっています。


実は、ツールによって謎の消費の扱いが異なっています。例えば、私の作成したツールでは、
謎消費(1消費) → 個体処理 → 謎消費(1消費)
となっており、

さびたコイル氏のツールでは、
謎消費(2消費) → 個体処理
となっています。

個体を連続で生成していくと、結局、個体生成消費同士の間に謎消費が2消費入る事になるので、どちらも同じ事になります。
始点をどこから始めるか、ですね。

分かりやすいように、実際に私が色違いが出た時の状況を、図を使い説明します。
色違いと、次の個体がどのように生成されているか分かりやすいよう色を塗っています。

f:id:quandra:20161225193300p:plain

私のツールでは、紫色のseedの部分を始点とし、その時の乱数値を最初の謎消費1個目にしています。
さびたコイル氏のツールでは、その紫のseedの一つ上のseedが始点となっています。これが消費1ズレの正体ですね。

さらに、TSVの求め方ですが、性格値判定が途中で打ち切られているのが分かると思います。

国際孵化+お守りなので8消費の性格値判定が、2回しかされていない
→色違い判定を満たし、打ち切られている

という事です。したがって、最後の性格値判定、つまり打ち切られた箇所の乱数値からTSVを求めることが出来ます。
これは色違いの次の個体が分かっているから出来ることです。

今回の図は、コイキング同士の結果ですので、ボール遺伝が発生しています。
つまり、色違いの次の個体のseedの乱数値から、3つ上(謎消費1個とボール遺伝消費1個を挟んで)の、0x6FCC54D3が色違いを満たした性格値と分かります。
メタモンや異種間の孵化の場合は、ボール遺伝が発生しないので2つ上を見れば良いでしょう。

ちなみにTSVもといPSVの求め方は、
(上位16bit xor 下位16bit) / 0x10
ですので、私のTSVは945と求めることが出来ます。

セーブデータの中身を見ること無く、TSVを求めることができましたね。

さらに詳しく知りたい方へ

もっと乱数調整の事を学びたい!という人向けに、少し難しい記事を紹介しておきます。きっと役に立ちます。

・入門
乱数調整 入門 - mizdra's blog (イベントカレンダー1日目の記事)

・過去作の乱数
BW2孵化乱数の仕組みと方法 : ただの雑記byさき (特性の部分がSMとほぼ同じ処理)

Mersenne twister、及びTiny Mersenne twister関連
メルセンヌツイスタの調律を行列で書く - oupoの日記 (前提知識として)
SM孵化乱数列を計算する : ただの雑記byさき (最下位1bitのお話)
SM孵化の乱数列生成アルゴリズムについて (イベントカレンダー6日目の記事)
Tiny Mersenne twisterの逆算 (イベントカレンダー9日目の記事)

最後のあいさつ

いかがでしたでしょうか?
今回は、SM孵化乱数とイベントカレンダーの最終日という事で、このような記事になりました。
スキームを理解した上で乱数調整を行うと、失敗した時も、スムーズに解決に導くと思います。


私がイベントカレンダーの最終日を締め括って大丈夫なのか疑問ではありますが、最後に一つ締め括らせて頂きたいと思います。

みなさんも楽しい乱数調整ライフを過ごしましょう! チャオ!✋