LCG(線形合同法)について

LCG(線形合同法)とは、擬似乱数列を生成するアルゴリズムの一つです。
S[n+1] = (A * S[n] + B) mod M という形をしています。
またLCGは周期性を持ち、ループしています。
ポケモンでは3世代以降のすべての世代において何かしらの形で使用されている疑似乱数生成器。
(初代・2世代については調べてません)

S[n+1] = (0x41C64E6D * S[n]) + 0x6073
3世代・4世代で使用されてる通常LCG
S[n+1] = (0x5D588B656C078965 * S[n]) + 0x269EC3
5世代・6世代で使用されている通常LCG
S[n+1] = (0x6C078965 * S[n]) + 1
4世代の一部で使用されてるLCG(Alternative pseudorandom number generator (ARNG))
S[n+1] = (0x343fd * S[n]) + 0x269ec3
XD・コロシアムで使用されているLCG
S[n+1] = (0x4A9EEACD * S[n]) + 0x63FD404B
FRLGのおしえテレビ特有のLCG、詳しくはこちら
別のLCGではなく、一定の速度で高速消費されているだけのようでした、詳しくはこちら

以上がポケモンで使用されているLCG(だと思う)

ゲームが開始されるとプログラムはseedと呼ばれる32bitの変数を作り出す、これがいわゆる初期seed。
そして乱数生成器が呼び出されるとこのseedを式に当てはめ、新たなseedを呼び出す。
ポケモンにおいては式によって得た数字の下位32bitを次のseedとし、そのseedの上位16bitを疑似乱数としている。

LCGで実際に乱数を生成していく具体例

3世代で使われるLCG、S[n+1] = (0x41C64E6D * S[n]) + 0x6073、を例にする。
今回は電池切れRSの初期seed、0x5a0、を使用する。
また16進法の計算はWindows付属の電卓(表示形式:プログラマ)で行うことができる。
0x41C64E6D * 0x5a0 = 0x171FB792520
0x171FB792520 + 0x6073 = 0x171FB798593
0x171FB798593の下位32bit(つまり2進数にしたときの下32桁、または16進数の時は下8桁)を次のseedとする。
LCGを電卓で計算
画像の通り、0xFB798593をseedとし、この上位16bit(16進法時は上4桁)を疑似乱数とする。
今回の例では0xFB79が疑似乱数である。
乱数生成器を繰り返し実行する場合、次は先程得た0xFB798593を式に当てはめ
0x41C64E6D * 0xFB798593 + 0x6073 と計算していく。
このように繰り返していくと、
0xFB79、0xBC23、0x15B6、0x163B、0xF978、0x9A3B……というような疑似乱数の数列が生まれる。

サブコンテンツ

このページの先頭へ