昨年、エメラルドループについてちょっと触れてみましたが、乱数調整についてお話したいなあと思っています。また、エメラルドだけでなく、DPtでもその仕組みが解明されているとか。まずはポケモンの個体値などといった隠し要素のところから話を進めたいと思います。


個体値と性格値


ポケモンには同じ種類やレベルであっても能力の中身が違うものもいるみたいです。ちなみに、ポケモンの能力を決める要素として種族値や個体値、努力値、性格がありますが、そのうち種族値や個体値、性格の3つはポケモンをゲットした時から決まっており、どんなに努力を積み重ねようとしてもこれらの値を変えることができません。ただ、種族値はポケモンの種類ごとに決まっているため、能力の差を作りだしているのは個体値と性格の2つといえます。


個体値はポケモンが生まれつき持っている素質のことで各ステータスごとに0~31の個体値が設定されており、その組み合わせによって個体差を作っています。また、持っている性格に応じて上がりやすい能力や上がりにくい能力が決められていますが、性格そのものを決めているのが性格値という隠しパラメーターなんです。つまり、個体値と性格値の2つで個々のポケモンを個性づけているといえます。ちなみに、性格値は性格の決定だけでなく、特性の決定や色違いの判定なんかにも使われています。


乱数


ポケモンには種族値や個体値といった隠しステータスがいくつもあるけど、その中で個体値と性格値はどのように決まるのでしょうかはてなマークこれらは1匹ごとに違っているという特性からランダム性があるといえます。ポケカであればランダム性のある処理なら主にコインが使われますが、エメラルドやDPtといったポケモンのゲームに関してはコンピュータである以上、外部からの操作がない限り完全なランダムな数(乱数)を作りだすことができません。そこで、計算によってランダムな数(擬似乱数)を作りだしているというわけ。作りだした乱数は一見するとランダムに決定した数に見えるが、確定的な計算によって求めているにすぎないのでサイコロサイコロやルーレットのように完全に予測不能なものではありません。逆に仕組みさえ分かれば予測することも不可能ではないといえますね。


擬似乱数は内部の初期値(シード)を元に乱数列が生成されるため、初期(シード)値が同じであれば同じ乱数列になってしまいます。したがって、時間などといった常に変化するものが初期値としては望ましいといえます。

ただ、エメラルドでは初期値が0に固定したためにリセットしても以前ゲットした時と同じ能力のポケモンをゲットしてしまうことがたびたびあるみたいです。

エメループ

先ほど述べた通り、エメラルドでは乱数の初期値を固定されているためにどんなソフトであっても同じ乱数列しか生成されません。つまり、タイミングが同じであれば個体値の組み合わせは同じということになりますね。では、乱数はどのようなタイミングで行われるかというと、フレーム(エメラルドでは1/60秒)単位で計算されるみたいです。つまり、エメラルドにおいてはソフトを起動してからの時間によって個体値や性格を決定されており、個体値を決定するタイミングが同じであれば同じ性格で同じ能力のポケモンが出てしまいます。つまり、電源やリセットしてからAを押すまでの時間をずらすことでこういった現象を回避することができるというわけだが、これを利用することによって個体値の高いポケモンを狙うということもできるみたいです。これについては次回お話したいと思います。


(2009-07-02 修正・加筆)