DS版ポケットモンスターにおける乱数の仕組みとその利用方法について書きます。
HGSS版の違いは赤字で書いてあります。
2010/06/28 メモリに格納されているSEED値とその時使われる乱数の値について統一して書き直しました。
間違っている場合があるので旧版も残しておきます。
乱数調整に関連したツールをいくつか作ったのでよかったら使ってください。
・HGSS固定シンボル乱数調整
・タマゴ性格値調整
・裏ID判定
前のSEEDによって求められ、次のSEEDを求める際使われる数値。
SEEDから計算して得られる、実際の計算に使われる値。
例えばSEEDの上位2バイト等。
ゲーム中ではリアルタイムに計算されているとしても、疑似乱数は数列として扱う。
それだけで完結した数列を成すのは「乱数」ではなく「SEED」の方なので、SEED数列と言うべきかも。
ある時点でメモリ内のSEED格納用のアドレスに格納されている値のSEED数列の位置 「SEEDの位置が[n]」であるときに生成される乱数は[n+1]の位置のSEEDが使われることに注意。
SEEDの位置を数列の次の項にし、更新後の値から乱数を得ること。
DPtでは、野生ポケモンと遭遇(エンカウント)したときにその野生ポケモンの性格値・個体値が決められるのに乱数が使われる。
また、タマゴの性格値が決定される瞬間(育て屋爺が横を向く瞬間)にも、その性格値が決められるため乱数が使われる。
ただしこの2つの乱数は別の計算方法で数列化されており、前者を遭遇乱数列、後者をタマゴ乱数列と呼ぶことにする。
どちらもSEED1個は32bit。
遭遇乱数列は項の上位16bitが乱数として使われる。この実際使われる乱数の数列を{r[n]}とする。
遭遇乱数列とタマゴ乱数列の初項は共通で、「つづきからはじめる」を押した瞬間に決定される。
この値を0xABCDEFGHとすると
遭遇乱数列を{S1[n]}とすると、
S1[n+1] = S1[n] * 0x41c64e6d + 0x6073となる。ただしS1[0]=初期SEEDで、33bit以上は切り捨て。
上にも書いたように、r[n]はS1[n+1]の上位16bitとなるので、最初に使われる乱数はS1[0]ではなくS1[1]の上位16bitであることに注意。
犬→ラティの順に処理。
犬は最初はライコウ→エンテイだが、ライコウだけを倒して殿堂入りで復活することで入れ替わる。
次に使われる乱数をr[n]とすると
r[n]で位置を決定(エンテイ・ライコウの場合は16で割った余りがジョウト道路の昇順に対応、ラティアス・ラティオスの場合は25で割った余りがカントー道路の昇順に対応)
ただし、再開するレポートを書いた時点での徘徊の位置と同じだった場合は再計算。
(徘徊しているポケモンの数+再計算回数)個消費
連れ歩いているポケモンに話しかけることで消費する。
眠りの場合1回話しかける毎に4消費、
火傷の場合「やけどでくるしいようだ」で2、「がんばってついてきている」で4消費。
参考:ktxadのブログ
しぐさ毎の優先度が設定されており実際に表示されたメッセージの優先度個消費。
電話をかけることで消費することがある。
判明しているところではトゲピーを見せた後のウツギ博士に電話で1個消費。
この際次に使われる乱数をr[n]とするとr[n]を3で割った余りによって内容が変わる。
また、再戦待機中でないたんぱんこぞうのゴロウに電話で2個消費。
ラジオを聞くことで消費することがある。
オーキドはかせのポケモンこうざについて判明している。
参考:oupoの日記
(手持ちポケモン数)個消費
ぼうけんノートで「○○を倒した」「○○を捕まえた」と書かれたページを「開く」度に2個消費。
メニューから使ったときの1ページ目でも消費しうるので注意。
草むら、洞窟、水上などポケモンが出現しうるマスで移動または方向転換をするとエンカウント判定が発生。
次に使われる乱数をr[n]とすると
これがマス移動で1回、方向転換で1回行われるので、「向いていない方向へ移動」では2回行われる。
ただ、「出現マス」から「非出現マス」に移動するときは、移動のみでも方向転換移動でもこの処理は行われない。
スプレーを使っていても処理は行われる。
草むらで使うと1個、洞窟・水上で2個消費してエンカウント処理へ。
HGSSでは洞窟・水上でも1個消費
ポケモンが出現しうるマスでのみ消費する。
次に使われる乱数をr[n]とすると
・r[n]%100で出現ポケモン決定
・r[n+1]%(Lvmax-Lvmin+1)+Lvminでレベル決定。先頭の特性が「はりきり」「やるき」「プレッシャー」以外の場合2個消費してエンカウント処理へ。
・それらの特性の場合r[n+2]%2が1だとレベルがLvmaxになり合計3個消費してエンカウント処理へ。
参考:oupoの日記
釣り上げたとき3個消費してエンカウント処理へ、はやすぎたでは消費無し
上記で「エンカウント処理へ」となった場合発生。
上記処理が終わったときの次の乱数をr[n]とすると
戦闘中消費した乱数は戦闘終了後元の位置に戻り、1個消費。つまり、戦闘終了後の次の乱数はr[m+5]。
(※を行った回数×2+4)個消費
次の乱数をr[n]とすると
・r[n]の上位1bitが0ならシンクロ成功、1なら失敗。失敗した場合はこの乱数が1個消費された状態でシンクロ無しエンカウント処理へ。戦闘中消費した乱数は戦闘終了後元の位置に戻り、1個消費。つまり、戦闘終了後の次の乱数はr[m+5]。
(※を行った回数×2+4)個消費
次の乱数をr[n]とすると
・r[n]を性格値の下位16bit、r[n+1]を性格値の上位16bitとして性格値生成4個消費
次の乱数をr[n]とすると預けた親の種類・IDに依存する確率がr[n]*100/0xffff以下のときタマゴができる。1個消費
かわらずのいしを持たせているときさらに一個消費しr[n+1]が0x7fff以下のとき性格遺伝。
爺さんからタマゴを貰うとき、メッセージが消えた時点でタマゴの個体値が決定。
その時点での次の乱数をr[n]とすると
8個消費
フレンドリィショップの配達員からポケモンを貰うときの個体値は、次の乱数をr[n]とすると
r[n]を下位から5bitずつH,A,B、r[n+1]を下位から5bitずつS,C,Dとして個体値生成。
2個消費
主人公と同エリア上のNPCが移動したり方向転換したりするときに消費。
移動も方向転換もしないNPCは消費しない。
624項の数列{t[n]}があり、t[0]から順に消費され、t[623]が消費されたとき{t[n]}が更新され、またt[0]に戻る。
t[n]の値を使う順に並べたものが、タマゴ乱数列{S2[n]}となる。
更新する処理がm回行われた後の{t[n]}を第mテーブルと呼ぶことにし、S2[(m-1)*624+n]は第mテーブルのt[n]と等しい。
最初に1回更新されるので、第0テーブルはSEEDとしては使われず第1テーブルの計算のみに使われる。
n:1〜623であり小数点以下は出る度に切り捨て。
k[0],k[1]を32bitまで保持する変数として
・k[0] = (t[A] and 0x80000000) or (t[B] and 0x7fffffff)この処理がA,B,Cが以下の順として行われる。
・A=n、B=n+1、C=n+397 (n:0〜226)1個消費。タマゴ乱数列のSEEDをEとすると、k[0~2]を32bitまで保持する変数として
・k[0] = (E/0x800) xor E小数点以下は出る度に切り捨て。
性格遺伝フラグが立っている場合性格値が適当なものになるまで上記の方法で生成し続ける。
国際結婚(両親の出身国が違う)場合、上記性格値生成の後、性格値をPとして、Pで色違いにならないとき
が最大4回(途中で色違いになったら終了)実行される。
この処理では乱数は消費しない。
ポケッチアプリでなつきチェッカーを開いたときと、なつきチェッカー中に下画面を連続で2回タッチしてポケモンが跳ねるエフェクトがあったときに(手持ちのポケモン数*2)個消費。
ただしタマゴは手持ちとしてカウントされない。
ポケッチアプリでコイントスをしたとき(コインを投げるエフェクトがあったとき)に1個消費。
電話をかけると消費することがある。
判明しているところではたんぱんこぞうのゴロウにかけると内容に関係なく2個消費。