人生takゲー

乱数とか構築とか。n番煎じだったりします。

【BW乱数】釣りバカ日誌第一話、レベル指定泡釣り乱数編【泡釣り乱数】

 こんにちは。ハマちゃんです(大嘘)

 今回は釣ります。泡釣り乱数です。普通の釣り乱数より手間がかかる、レベル指定もやります。これにより、個体生成の”スキーム”について理解を深めることができます。スキームとは個体生成のときの仕組みのようなものです。

 当然ですが、今回の乱数は野生乱数(固定ではなく野生)の応用なので、当然その基礎知識はあるものとして話を進めます。

 ひとまず、bwseedlistの右下のその他の部分を見てください。キャプチャを貼っておきます。

f:id:takpoke:20140627013859j:plain

 ”生の乱数値を表示”というものがありますね。個体生成はこの乱数値というものによって決定されています。一匹の野生のポケモンの個体決定は複数の連続する乱数値によって個体情報が決定します。

 では具体的に話をしていきます。今回は泡釣り乱数ですので、泡釣り乱数のスキームについて解説します。消費位置nの位置での乱数値をr(n)とすると、r(n)はシンクロ判定、r(n+1)は出現ポケモン決定、r(n+2)は出現ポケモンのレベル決定、r(n+3)は性格値決定、r(n+4)は性格決定にそれぞれ当てられています。つまり、消費位置nで泡釣りを行うと、r(n)→r(n+4)までの乱数値により決定されたポケモンが出現します。ここで、シンクロ判定r(n),出現ポケモンr(n+1),性格値r(n+3),性格r(n+4)はbwseedlistによって検索の結果が表示されます。しかし、出現ポケモンのレベル決定r(n+2)の結果は表示できません。ですが、このr(n+2)の値についてある程度の計算処理を行うことで泡釣り乱数のレベルを事前に調べることができます。では実際にやっていきましょう。

 今回、高校生レベルの計算をしますので、ある程度は算数ができるようにしてください。可能な限り丁寧に書いたつもりなので、分からないことはないと信じたいですが。

 その計算の前に、泡釣り乱数、および釣り乱数の基礎のお話です。釣りでのテーブル、スロットについてです。

通常の野生乱数ではスロットが0~11の12個あります。

まず、野生出現確率をパーセンテージ化すると以下のようになります。

野生0,1→20%(決定値0~19,20~39)

野生2,3,4,5→10%(決定値40~49,50~59,60~69,70~79)

野生6,7→5%(決定値80~84,85~89,)

野生8,9→4%(決定値90~93,94~97)

野生10,11→1%(決定値98,99)

ここで、決定値とは野生出現決定の乱数値r(n+1)について以下の計算処理

 0x{r(n+1)}*0xFFFF/0x290>>32→r(n+1)*65535/656*2^32

これを行った際の整数値です。数学的に少々問題があるとすれば、0xが16進数を示していること、(0xFFFF=65535,0x290=656)、>>32が2進数で下32桁切り捨て処理を行うことを意味しているということです。つまり2^32で割れば良いわけです。

 正確にはこの整数値の範囲から出現ポケモンを決定していますから、上記の表記は実際のプログラム的な処理の手順とは順序が逆ですね。

 では、それを釣りについて対応させていきます。波乗りおよび釣りはスロットが0~4の5つしかありませんが、野生スロットとの対応は以下の通りになります。

釣り0→野生0,1(決定値0~19,20~39)

釣り1→野生2,3,4,5(決定値40~49,50~59,60~69,70~79)

釣り2→野生6,7,8,+α(決定値80~84,85~89,90~93,94)

釣り3→野生9,10,-α(決定値95~98)

釣り4→野生11(決定値99)

 野生3を狙うときのみ、野生リストの9の箇所で1/4の確率で野生2のポケモンが出現してしまう可能性があります(±αの項)。この地雷を引きたくない場合は上の式のとおり計算しましょう。光らせるためにID調整をする場合はやり直しが面倒なので事前に計算して狙った個体が出ることを確認しておくとよいでしょう。簡単な電卓1つでポチっと計算できるので難しい問題ではないですし。

 では本題のレベル決定の話にいきます。BW1で、消費位置nで泡釣りを行った際のレベル決定式は以下の通りです。

 (0x{r(n+2)}*0xFFFF/0x290)>>32 mod (maxLv-minLv+1) + minLv=Lv

 この式を利用し、今回はレベル50色ミロカロスを目標に釣りを行いたいと思います。レベル50で捕まえたポケモンは捕まえた瞬間にすでに美しい数値なので、レベル50を狙います。OLは犯罪です。折角できることなのですから、美しいポケモンを使いましょう。まず、ミロカロスは出現レベルが45~70なのでmaxLv=70,minLv=45で計算を進めます。

 今回、求めたいのはr(n+2)の範囲です

r(n)は乱数値ですので当然

0x00000000≦r(n+2)≦0xFFFFFFFF

になります。

 ここではガウス記号を用いて計算をしていきます。ガウス記号については高校での数学Ⅲで習うものですので、日本人の過半数はガウス記号について習っていませんから、知らなくても恥じることは無いと思います。簡単に解説しますと、ガウス記号[x]とはxを越えない最大の整数を意味します。式では以下の感じです。

[x]≦x<[x]+1

これを用い、ミロカロスのレベル計算を進めていきますと

 (0x{r(n+2)}*0xFFFF/0x290)>>32 mod (70-45+1) + 45=50

{r(n+2)*65535/(656*2^32)} mod(26)=5

modというものについて知らない人がいると思うので記しますと、modとはつまり”余り”です。左辺の数字を26で割った余りが5であるということです。

つまり、左辺の数字は26k+5(k∈Z)です。(k∈Zはkは整数という意味)

{r(n+2)*65535/(656*2^32)}÷26=26k+5

を意味します。

今、r(n+2)≧0なので、k≧0が成り立つからこの場合のみ考えます。

まずk=0のとき

5≦r(n+2)*65535/(656*2^32)<6

214961361≦r(n+2)≦257953632 → 0x0CD00CD1≦r(n+2)≦0x0F600F60

k=1,2,3とやっていき、k=4のとき

26*4+5≦r(n+2)*65535/(656*2^32)<26*4+5+1

4686157649≦r(n+2)<4729149921

となり

4686157649=0x117511751≧0xFFFFFFFFとなり上限値を越え、不適となります。

以上より、レベル決定乱数値r(n+2)は

0x0CD00CD1~0x0F600F60(n=0)
0x4F704F71~0x52005200(n=1)
0x92109211~0x94A094A0(n=2)
0xD4B0D4B1~0xD740D740(n=3)

と決定されました。では具体的に検索して釣りたいと思います。

 今回はめざ草ミロカロス個体値31-0-31-30-31-31を狙います。最初からキー入力する気満々です。A個体値甘えは威張る、イカサマが蔓延る現環境ではギルティですからね!

というわけでSSS4で検索します。今回は泡発生のために歩きますので、なつき判定による個体値乱数列消費が発生します。一回現場に着いたら数匹連続で釣れるように、手持ちを6匹、つまり個体値乱数列は12を推奨します。8~12とする人もいますが、奇数のseedの削除が面倒なので12固定でいいと思います。

f:id:takpoke:20140608004929j:plain

ちなみにですが、初期seed候補は30個くらい出したほうがいいです。なぜなら、ミロカロスはスロット3or4なので釣れる乱数値は全体の5%で、かつシンクロ判定50%、さらにレベル指定が1/26で全乱数値のうち約0.1%の乱数値しか該当しない箇所を狙っていますし、消費数が多すぎるのも嫌だからです。しかし、今回は走りますし、NPCがいますので、余裕をもってn=150前後以降の乱数値を利用しましょう。

 で、初期SEED候補が出るわけですが、bwseedlistに入れる前に、bwseedlistのフォルダの中にyasei.txtを作成します。今回はミロカロスかどうかだけが分かればいいのでざっくりとこんな感じで作成します。

f:id:takpoke:20140607231516j:plain

○はミロカロス、×はそれ以外のポケモンです。

あとはSSS4検索結果の初期seedをbwseedlistに入れ、一つ一つしらみ潰しで見ていくだけです。ちなみにですが、結果、この乱数の箇所がヒットしました。

f:id:takpoke:20140607235405j:plain

n=172でシンクロ○で、n=173の箇所で決定式に代入すると

0xF7B8EDA1*0xFFFF/(0x290*2^32)

=4156091809*65535/(656*2^32)=96.7となり、ポケモン3であることが確認が取れ、

n=174は先に示した範囲に含まれています。

 というわけで乱数しましょう。性格値はn=172の位置の性格値なのでそれが光るようにID調整しまして、周回、乱数です。

 現場は1番道路です。

f:id:takpoke:20140608002250j:plain

スタートこの辺でやります。ゴールドスプレーを使うことで250歩はかることができ、懐き判定2回、256歩分をおおよそ測定できますね。泡は画面内にしか出ないので、できるだけ上側を走りましょう。そうすることで下の草むらが揺れる可能性も減ります。

で、256歩中に20歩ごと、計12回泡生成判定がありますが、適当に走ってれば大体泡ができます。原理的には泡発生はゲーム起動から20歩ごと、その瞬間の乱数値が0x19999999以下であれば泡発生します。しかし、NPCがいるのであんまりうまく決まらない印象を得ます。適当に走りましょう。それで出なかったらまた考えましょう。私は適当に走ったら泡ができたので、それでいいかなーと。

f:id:takpoke:20140608003653j:plain

あとはn-1まで消費して釣りしましょう。

f:id:takpoke:20140608004159j:plain

ということで釣れた方はお疲れ様でした。後半は普通に消費して釣りをするだけなので飛ばしましたが、こんな記事を読む人なら簡単にできることだと思いますし。大丈夫でしょう。

 

P.S.数的処理を行っていますが、厳密には証明すべき内容がいくつかありますが、裏で証明済みです。数学的にミスがあったり、分からないことがありましたらコメント等お願いします。