ろいしんぶろぐ

乱数調整とか

性格値の話

 

ポケモンwikiその他各種ブログに載っている情報は古かったり間違っていたりするので、各世代をまとめたものを書いてみます。

性格値とは

性格値はポケモンそれぞれが持つ16進数8ケタの値です。

例えば、C5EE7CF6のように、0~Fまでの数字が8個並んでいます。

(16進数の世界ではA~Fまでのアルファベットも便宜上数字として扱います。)

この8ケタの数字によってポケモンのさまざまな情報が決定されています。

性格値からわかること

まず、第3世代から第5世代まで共通することとして、性別・個性・(パッチールの模様)が性格値から決められます。

 

・性別

性格値を256で割った余りを性別値と呼びます。16進数の場合、下2ケタがそのまま性別値になるので、256云々の部分は頭の片隅に残すぐらいで大丈夫です。

性格値がABCDEFGHだったときは、GHが性別値になります。この値をポケモンごとに設定された雌雄比に従って評価し、

♀:♂=1:7⇒GHが0~1Eなら♀,1F~FFなら♂

♀:♂=1:3⇒GHが0~3Eなら♀,3F~FFなら♂

♀:♂=1:1⇒GHが0~7Eなら♀,7F~FFなら♂

♀:♂=3:1⇒GHが0~BEなら♀,BF~FFなら♂

となります。

 

ちなみにPHSが出力している性別値は100分率に変換したものなので、混同すると痛い目にあいます。

 

・個性

個性は性格値を6で割った余りと個体値から決められます。

余りを求めるときにわざわざ10進数に直すなんて無駄なことはやめましょう。

Windows付属の電卓で表示からプログラマ用電卓に設定後、16進数にチェックを入れて

性格値を入力して Mod 6

これだけです。性格値C5EE7CF6の場合

C5EE7CF6 mod 6 ⇒ 4

となります。この余りから最も優先される個性の位置が決まります。

f:id:Blastoise_X:20140318010309j:plain

余り4の場合、Cの位置から時計回りに個性の優先順位がつきます。

ここで、個体値の最大箇所の中で最も優先順位の高いものが個性の場所になります。

 

次に、第3,4世代と第5世代で共通しないことについて

・特性

夢特性以外の特性は性格値のある部分の偶奇によって決まります。

性格値をABCDEFGHとしたとき、

第3,4世代⇒Hの偶奇

第5世代⇒Dの偶奇

それぞれの場所が偶数(0,2,4,6,8,A,C,E)なら特性1

奇数(1,3,5,7,9,B,D,F)なら特性2です。

ちなみにトゲピーなどのXD内特性は個体値を決める乱数と一緒に決められていて、性格値とは別に決まっています。進化させると特性が変わることがあるのはこれが原因。 

 

 

・性格

第3,4世代⇒性格値を25で割った余り

第5世代⇒性格値からは決まらない

第5世代では性格値と性格そのものには全く関係がありません。それぞれ別の値からつくられているので、性格値から性格を求めることは不可能です。

 

とりあえず大きいところだけ書いたけど足りるでしょう。

まとめ:第5世代で少し変更されたので気をつけましょう。

 

ちなみに、XYからパッチールの模様と性格値の間に関係性がなくなりました。

これによりパッチールの模様から性格値を求めるという方法が不可能になったので、もちろん性格値から計算されるPSVも求まりません。本当に残念です。

TVを利用したボルトロスの性格値確認

ボルトロスが飛び立った直後に小屋に戻ってテレビの内容で現在の乱数消費位置を探すという方法

ペラップ音程聞けない人でも確実に消費数の推定ができるので乱数調整の範疇で性格値を調べるには良い方法

 

数回やってみたけれど、テレビ内容の12~13ほど前に性格値決定箇所が集まっていたので精度はよさそう。

テレビ内容の50~60前程度という報告もあったので条件によってはかなり前後するようです。

なるべく速く小屋に入ってNPC等の消費を抑えましょう。

 

0~9分の内容だけど、条件を満たしてるはずなのに差し替えられたりしてて安定しなかったから10~59分のほうが無難かな。判定もこっちが細かいし。

 

今回北米ROMで試したので北米版のTVlistを作成しました。おだんさんのTVlistツールの日本語版テキストと差し替えれば使えるので北米版の人はご自由にどうぞ。

http://www1.axfc.net/u/3163958.txt?key=leucine

もとの日本語版のtxtはjpnTVlist.txtみたいな感じで名前だけ変えて置いとくといいと思います。

おだんぽよ on Twitter: "エントリ中にある"おだんさんのTVlistツール"とはこれです http://t.co/BqgVD9pC0M"

第五世代でのMT消費

孵化乱数をするために手動で個体値乱数列を調べる方法として行われていた化石prprで禁止されていたニックネーム画面の挙動を調べてみた。

 

原点回帰ということで連続個体値が分かりやすいので調査場所はシッポウの化石博物館

1体目を受け取りNN変更画面を表示したのち2体目を受け取ると間に7つのMT消費が確認できた。

 

新規個体じゃなくてもいいのか気になってヒウンの姓名判断士のところへ行ってNN変更画面を表示して挙動を調べると、NN画面表示1回ごとに

MTが7つ、LCGが2つ消費されている模様

パソコンの消費と変わんねーじゃねーか!

 

偶数消費できればBWでも効率的なMT消費が期待できただけに残念。

使える場所が限られるのでほぼパソコンの劣化です本当にありがとうございました。

多分これが一番無駄だと思います。

皆様お待たせしました。

 

ついに、あの乱数が帰ってきました。

 

f:id:Blastoise_X:20140110014432j:plain

 

第4世代自販機乱数に成功しました。

参考にしました→http://blastoise-x.hatenablog.com/entry/2013/01/28/113411

 

第4世代で自販機があるのは

DPt・・・トバリデパート5階

HGSS・・・コガネ百貨店6階、タマムシデパート6階

のみです。

どの場所を選んでもフロア内に不定NPCが1人ずついるので、NPC消費と闘いながらの調整になります。

自販機で連続して飲み物を買っている間はNPC消費の割り込みが発生しないので、目的消費付近まで来たら飲み物を買って確実に1ずつ消費を進めることもできます。

 

第4世代の自販機で当たりが出る確率については検索しても出てこなかったので、今回プラチナで調査しました。

結果から言うとr(n) % 64 == 0 のとき、当たりが出ます。

つまり、1/64の確率で当たりが出ます。この情報新規性あると思います。

 

普通に当てるだけでは面白くないので最高で何連続当たるかを検索したら、どうやら3連続が限界のようです。

3連続当たり→1回失敗→1回当たりという乱数の並びが見つかったので、今回はこのseed列を使うことにしました。

 

初期seed:0F080701

消費数:48

月×日+分+秒:15 or 271

時:8

フレーム+年-2000:1793

 

実際の調整手順は

トバリデパート6階のエレベーターの中でレポート

目標時間で起動し、コイントスで初期seed一致確認

エレベーターから出て速やかに自販機を目指し、自販機前でメニューを開く

↓ (ここまででNPCによる消費が4程度生じた)

ペラップの音程で現在位置を把握しつつ、目標消費数まで消費

飲み物を買う

ガコン!あたりだ!

ガコン!あたりだ!

ガコン!あたりだ!

 

 

多分これが一番無駄だと思います。

 

HGSSは調べてないけど多分一緒。

暇な人はHGSSで調べてください。日本全国の自販機乱数愛好家が喜びます。

→Kaphotics先生が調べてくれました

Past Gen RNG Research | Page 43 | Smogon Forums

やっぱり正しかったよ! 

 

今さら感あふれる4GenLCGの性質のあれ

命題

 

第3第4世代のLCGにおいて、2つのSEED AとBに A xor B = 0x80000000 の関係があるとき 

両者から順次生成される子SEED A(n)とB(n)の間にも 

A(n) xor B(n) = 0x80000000の関係が成立することが実際の乱数列から推定できる。 

 

続きを読む

ポケモンXY国際孵化の色違い判定について

※現状仮説段階でしかないので読み物程度に思ってください。 

 ※XYでのパッチールの模様は性格値とは別の値で決まっていることが後にわかったので少し書き直しました。(2014/3/21)

 

題名通りXYの国際孵化での色判定について、です。

 

前提としてXYの通常の色判定

1.TSV…トレーナーの表IDと裏IDをxorしたものの上位12bit

2.PSVポケモンの性格値を上下16bitずつに分けてxorしたものの上位12bit

3.TSV=PSVを満たせば色違いになる

これが正しいものとして話をすすめていきます。

 

国際孵化の事象を観察する上で新猫さんによるパッチールの国際孵化の事例を使用しました。

 

f:id:Blastoise_X:20131218003447j:plain

f:id:Blastoise_X:20131218003458j:plain

 

上:国内孵化

下:国際孵化

どうも同じ模様で色の成否が異なっているようです。

 

第5世代まではパッチールの模様が性格値から決められていたので今作もそうなっていると仮定すると同じ性格値で色の成否が異なるという結果になっています。

 XYのパッチールの模様は性格値とは別の値によって決められているので、この仮定が成り立ちませんでした。

 

このパッチールパッチールペインタDPt版で再現してみました。

f:id:Blastoise_X:20131218010335j:plain

性格値C707F0C4ぐらいかなと予想できます。

これを上下に分けてxorしてみると0x37C3となって新猫さんのTSV3568(0xDF0X)と異なっています。

 

ここからが本題

0x37C3と3568(0xDF0)を2進数で表記してみました。

 

0x37C3…0011011111000011

0xDF0  …110111110000

 

0x37C3の3~14bitの部分が0xDF0と一致しました。

 

これが偶然じゃないとすれば、今回の国際孵化での色判定は性格値からPSVを算出する場所を1bitずつずらしていって色になればそこで終了となっている可能性がありそうです。

わかりにくいと思うので書き方を変えるとこんな感じです。

for(i=4;i>=0;i--){

PSV=(HID^LID)>> i  mod 0x1000

}

この判定法なら1性格値で判定は最大5回まで行われることになりますね。まぁ妥当な確率ではないかと思います。

 

国際孵化の補足ですが、この色固定の最中に親を変えて調査した新猫さんの結果で、

日本ROMで海外言語を選択したトレーナーのポケモンを親に使用しても色違いが産まれたことから、

言語のみを海外に変えたポケモンと純日本産の組み合わせでも国際孵化の判定になる

ことがわかっています。

 

Special thanks

新猫さん

 

 

(追記)

プルナレフ氏の協力のもと、孵化に用いられる乱数列を固定した状態で国内孵化と国際孵化を切り替えたときに個性が変わるのかという実験を行いました。

 

供試個体

JPNゴース♀   HBCDS(赤い糸) 

JPNゴース♂   HBCDS(かわらずの石) 

ENGゴース♂   HBCDS(かわらずの石)

 

方法

♀を育て屋に預けた状態でレポートを書き、JPN♂を預けて1つ目の卵の個体値、個性を確認したのち、セーブせずにリセット

次にENG♂を預けて1つ目の卵の個性を確認し、固定してある卵を破棄する。

この作業を10回繰り返した結果

 

1回目 

日 HCDS 昼寝をよくする 

英 HCDS 昼寝をよくする 

2回目 

日 HCDS ものおとにびんかん

英 HCDS ものおとにびんかん

3回目 

日 HBCS うたれづよい 

英 HBCS うたれづよい

4回目 

日 HBCD イタズラがすき

英 HBCD イタズラがすき

5回目 

日 HBDS うたれづよい 

英 HBDS うたれづよい 

6回目 

日 HBDS うたれづよい 

英 HBDS うたれづよい

7回目 

日 HBCS うたれづよい 

英 HBCS うたれづよい 

8回目 

日 BCDS うたれづよい 

英 BCDS うたれづよい 

9回目 

日 HBCS 昼寝をよくする 

英 HBCS 昼寝をよくする

10回目 

日 HBDS 昼寝をよくする

英 HBDS 昼寝をよくする

 

以上のようになり、全ての試行で個性が一致している。

この個体値と個性の組み合わせで、全てが偶然一致する確率は約10万分の1程度なので、個性は変わらないものとみなしてもよさそう。

個性が過去作同様に性格値から算出されていると仮定すると、国際孵化の場合でも性格値の変更がないものと考えられる。

前述のパッチールの模様も考慮すると、今作のマスダメソッドは性格値の再計算を行わずにもとの性格値での色判定が緩められる、との解釈が妥当ではないかと考えられる。

 

 

追々記

完全なソースがないのだけれど、どうもパッチールの模様と性格値に関係性がなくなったらしい。

模様と性格値関係なかったらマスダメソッドも5th以前のものでいいはずだけれど個性が変わらなかったのは少し不思議。

性格値は残ってるけど色判定だけが別の32bitの値として分かれたって考えるのがいいのかもしれない。

いずれにしろアナログ解析はこれ以上厳しいので海外の解析待ち。

 

追検証を行ったのでこちらもご覧ください

XY孵化検証の続き - ろいしんぶろぐ

第五世代戦闘乱数のお話

ポケモン第五世代の戦闘時における技の命中、急所、追加効果の発生などを決定するために使われる疑似乱数列は第五世代での性格値乱数列と同じ方式のLCGを用いて順次計算されている。

 

戦闘乱数決定のために使われる乱数列をB(n)とすると

例えば、技の命中判定は

(B(n)>>32)*100>>32

で計算される値が技の命中率より小さいとき、技が命中する。

 

急所にあたるかどうかは

(B(n)>>32)*16>>32

で判定され、急所ランクが上がっていないときは(B(n)>>32)*16>>32=0ならば急所に当たるという判定が出る。

 

 

一般にB(n-1)で技を出した際の処理の流れは

B(n)  命中判定

B(n+1) 急所判定

B(n+2) ダメージ乱数

B(n+3) 追加効果判定

という風に決定され、必中技など判定に乱数を必要としない技ではB(n)で急所判定が行われるなど順に前に詰めて判定が為される。

 

この処理の順番を知っていると今後起こるであろうことは予測することができる。

 

調整例について

初期seed:A0CCD3D9C34306CD

で戦闘に入ったとき乱数列上位32bitと100分率の並びは

1 F51EB9FD 95
2 C598EBDB 77
3 76D8A53B 46
4 35C762E3 21
5 165FA8AD 8
6 53FDC974 32
7 D606FACB 83
8 31D768F3 19

という形であり、ここから予測できることは

・B(1)が95なので、ターンの最初に出される技の命中が95以下の場合外れる

・B(4)が21なので、最初に出した技の命中が100で追加効果が3割以上の場合、追加効果が発生する

・B(5)が8なので、こおりのキバ(ひるみ、氷漬けの効果判定が2つ)が使われた場合、2つ目の効果が発動する

などが挙げられる。

戦闘乱数と言うぐらいなら乱数を3つ消費して一撃技を撃てば当たるだろ、と思うかもしれないが、現状戦闘中に技使用以外で乱数を進める方法は見つかっていないので”戦闘乱数”から想像するようなことは対人戦ではほぼ不可能。

 

じゃあ戦闘開始時の初期seedを調整すればいい、となるがこの初期seedの決定方法は複雑で、

kaphotics氏によれば起動時の初期seed決定のようにSHA-1ハッシュ化を行っているようだが、メッセージデータが異なっているらしく通常の方法では算出できない。

ktxad氏のブログ2011年2月27日の記事によるとタッチスクリーンの押されている座標らしき値も使われているかもしれないので、実機での調整はほぼ不可能という認識。

 

ということで、戦闘乱数はなんだかよく分からないし乱数調整もできないという結論。

 

Twitterとかで戦闘乱数使ってるぜとか言ってる人は情報ください。

 

【追記】

Kaphotics先生に色々教えてもらいました。

戦闘乱数の初期seed決定には調整できない要素を2~3含んだメッセージデータを使ってました。それが何かを書くことはしません。

エミュレータ以外での初期seedの調整は事実上不可能なので、狙った初期seedを出すという調整はできません。

また、仮に初期seedが調整できたとしても、Wi-Fi対戦時には何らかの要因で初期seedが変更され別の初期seedで戦闘が進む場合があります。pokecheckでいう"broken"状態です。

こうなってしまうと例え初期seedを知ったところで、全く無意味な値に為り下がるため、戦闘乱数調整はできません。"broken"の原因についてはKaphotics氏も分からないとのこと。

 

結論:

戦闘乱数なんてできないからマトモにバトルしようネ~♪