mizdra's blog

ぽよぐらみんぐ

続ウツギ博士乱数

Pokémon RNG Advent Calendar 12日目の記事です.

www.adventar.org

昨日の11日目は水連さんの 乱数勢の情報倉庫 【ポケモンFRLG】初期SEEDの生成 でした. FRLGの初期Seedに関する日本語の情報がまとまったサイトが無かったので, 非常にありがたいです.

suiren1350.blog.fc2.com

概要

1日目の「乱数調整 入門」で扱ったウツギ博士乱数の続きです. (1日目の記事は乱数調整という言葉を初めて聞いた人にも分かるように頑張って書いたので皆読んでね!!)

mizdra.hatenablog.com

「乱数調整 入門」では

  • ウツギ博士が「ポケモンの しんかというのは~」というメッセージを15回以上連続で話す

ことを乱数調整しましたが, 折角なので同一メッセージの最大連続数及びその時の乱数 S[n], 初期Seed S[0] を求めておきましょう.

乱数を求める

という訳で乱数をプログラムを書きました. 前回の記事で使ったプログラムを再利用すればサクッと出来ます.

gist.github.com

実行

実行するぞ.

# 🙏 不慮の事故に備えてコンパイルする前に祈る 🙏
$ g++ AbuseMaxChainDrUtsugi.cpp -o AbuseMaxChainDrUtsugi.exe -lm -std=c++11
$ ./AbuseMaxChainDrUtsugi.exe
    r[n] % 3   max chain        S[n]
           0          20  0X97024D60
           1          19   0X15A9302
           2          19  0XD62B4730

結果から「ポケモンの しんかというのは~」は最大20連続, 「カントーには まだ ぼくの〜」「ポケルスが くっついた~」は最大19連続であることがわかります.

初期Seedを求める

乱数からそれを狙うことができる初期Seedを求めましょう. これも前回のプログラムを再利用してサクッと書き上げます *1.

gist.github.com

frameは800 ~ 10000F(約3分)に収まるようにしました.

# 🙏🙏🙏 祈る 🙏🙏🙏
$ g++ CalcInitialSeed.cpp -o CalcInitialSeed.exe -lm -std=c++11
$ ./CalcInitialSeed.exe
    n        S[n]        S[0]
   27  0X97024D60  0X961424C7
  184   0X15A9302  0XC60C148A
   88  0XD62B4730  0X4C1514D8

結果

結果を表にまとめます.

r[n] % 3 メッセージ max chain n S[n] S[0]
0 ポケモンの しんかというのは~ 20 27 0x97024D60 0x961424C7
1 カントーには まだ ぼくの〜 19 184 0x15A9302 0xC60C148A
2 ポケルスが くっついた~ 19 88 0xD62B4730 0x4C1514D8

r[n] % 3 == 0 で最大20連続. ちなみに初期Seedは 乱数逆算ツール を使うと自動で求めることが出来ます. 便利〜.

ツールの使い方は以下を参考に.

d.hatena.ne.jp

乱数調整する際の問題点

今回の問題点は消費数が多すぎるものがあることです (184消費とか). 一般的に使われる消費法で消費数が多いものは「連れ歩いている眠り状態のポケモンに話しかける(消費数: 4)」ですが, この消費法を用いても40回以上は眠り状態のポケモンに話しかけなければなりません. しんどいですね.

そこで, オーキドはかせのポケモンこうざを用いた消費法をお勧めします. この消費法であれば毎秒30消費以上を実現することができます *2. 便利〜.

こちらもツールの使い方は以下の外部サイトを参考に. ameblo.jp

ちなみに僕はウツギ博士に電話をするのに飽きたので乱数調整はしません *3. 誰か代わりにやって動画を上げてくれると @mizdra が喜びます.

おわり.

最後に

Pokémon RNG Advent Calendar 2016が全日埋まりそうでで嬉しさと驚きを感じています. 非常にマイナーな分野でそれに関わる人も少ないので全日埋まるとは全く想像もしていなかった…

それとつい先程, 最新作のSMの孵化乱数調整が実機で可能になったようです. めでたい 🎉🎉🎉

これに関する詳細な記事は後ほど公開されることでしょう. 楽しみですね.

明日は oupo さん担当の「TinyMTの逆算」です.

*1:任意の乱数から初期Seedを求めるライブラリ無かったので手書きする羽目になった. 誰か作ってくれ.

*2:ちなみにこれは自分の図鑑のコンプ状況をツールに入力しなければならないのでそこだけは面倒です. 一度ツールに入力してしまえば後はそれを再利用することが可能なのでやっておくと良いと思います.

*3:電話掛けてる時よりプログラム書いてる時のほうが5000兆倍楽しい