乱数調整概説
- 5. 擬似乱数生成器
第 3 ~ 5 世代のポケモンのゲーム内で使われて
いる擬似乱数生成器は主に以下の 2 つ
・線形合同法(Linear congruential generator; LCG)
・メルセンヌ・ツイスタ(Mersenne twister; MT)
それぞれが使われている項目
LCG:たくさん
MT:第4世代のタマゴ性格値、第 5 世代の
ほとんどの個体値、その他諸々
⇒ポケモンほとんど LCG !!!
- 6. 線形合同法(LCG)
LCG のアルゴリズム
擬似乱数 = 𝐴 × 種 + C 𝑚𝑜𝑑 𝑀
⇒ 𝑅 𝑛+1 = 𝐴 × 𝑅 𝑛 + C 𝑚𝑜𝑑 𝑀
現在の擬似乱数の値(𝑹 𝒏 )を A 倍して C を加え、
さらに M で割った余りを次の擬似乱数(𝑹 𝒏+𝟏 )
とするというのが線形合同法!
→実際にどんな計算をするのか、小さな値で実
験してみましょう
- 7. 線形合同法(LCG)
A=3 C=0 M=7 と設定すると
𝑅 𝑛+1 = 3 × 𝑅 𝑛 + 0 𝑚𝑜𝑑 7
という形になっています
ここに種として 𝑅0 = 6 を与えると
𝑅1 = 3 × 6 + 0 𝑚𝑜𝑑 7
𝑅1 = 18 𝑚𝑜𝑑 7
𝑅1 = 4
となって、同様に
𝑅2 = 5 𝑅3 = 1 𝑅4 = 3 𝑅5 = 2 𝑅6 = 6 …
となります
- 8. 線形合同法(LCG)
ここで得られた値を並べたものが擬似乱数列
になります
擬似乱数列: 6,4,5,1,3,2,6,4,5,1,3,2,6…
いま、 6,4,5,1,3,2 という 6 つの数字の並びが
繰り返されているのがわかります
⇒つまり、この擬似乱数列は周期性を持ち、
その周期は 6 である!
同じものが繰り返されることを”ループする”
と言いますよね
そこで、この LCG による擬似乱数列は次の
ように表せます
- 10. 線形合同法(LCG)
ポケモンでよく使われているLCG
Rn+1 = Rn * 0x41C64E6D + 0x6073
Rn+1 = Rn * 0x5D588B656C078965 +
0x269EC3
9FF1E41D
98ED56CC
5B487D4F
EE25CD16
1F9966D1
C84AD570
99856123
0575665A
1BC860C5
BF2B9A54
- 11. メルセンヌ・ツイスタ(MT)
とっても優秀な PRNG
1. 周期が長いヤバい
32bitLCG : 232 (10 ケタ)
64bitLCG : 264 (20 ケタ)
MT : 219937-1 (6002 ケタ)
2. ランダム過ぎヤバい
前後の乱数との相関がほぼない
3. 逆算できないヤバい
LCG と違って逆算が困難
MT の詳しい説明は省略
- 21. 個体生成の仕組み
I. 第 4 世代
i. 徘徊系
ii. 固定シンボル・野生
iii. 孵化
II. 第 3 世代
i. 固定シンボル
ii. 野生
III. 第 5 世代
i. 固定シンボル・野生
ii. 孵化
iii. その他
- 22. 個体生成の仕組み
I. i. 第 4 世代徘徊系
スキームは
定数消費→性格値下位決定→性格値上位決定
→個体値(H,A,B)決定→個体値(S,C,D)決定
PID mod 25 の値で性格を決定
r(n) 7CF6 LID
PID
r(n+1) C5EE HID
r(n+2) FDDF HAB
r(n+3) 7FFF SCD
基本スキーム
LID (性格値下位)
HID (性格値上位)
HAB
SCD
- 23. 個体生成の仕組み
I. ii. 第 4 世代固定シンボル・野生
諸処理(スロット決定,レベル決定, etc)
→性格決定→性格値探索→個体値決定
r[n] 乱数値 仮PID mod 25 性格
r[1] 8599
AD9E8599 7 のんき
r[2] AD9E
r[3] FA53
9A12FA53 20 おだやか
r[4] 9A12
r[5] C07F
85E7C07F 23 しんちょう
r[6] 85E7
r[7] DFBF
4CA6DFBF 21 おとなしい
r[8] 4CA6
r[9] 9C07
2ED69C07 8 わんぱく
r[10] 2ED6
r[11] 7CF6
C5EE7CF6 10 おくびょう
r[12] C5EE
例:r[0] でシンクロ可判定を受けて
性格が「おくびょう」に決定された
「おくびょう」になる
性格値が見つかるまで
探索する
- 25. 調整方法
3. 初期 seed 候補の 1 つで起動する
r[n] 7CF6 LID
PID
r[n+1] C5EE HID
r[n+2] FDDF HAB 個体値
r[n+3] 7FFF SCD 個体値
おったわw
初期 seed 候補
(どれを選んでもいい)
4. 目標の並びを達成できるよう
に乱数を消費する
1. の作業で見つかった並び
- 27. 個体生成の仕組み
I. iii. 第 4 世代孵化
2 つのステップに分かれる
①性格値生成……タマゴ生成時
②個体値生成……タマゴ受取時
①性格値生成
LCG 1 つを使用してタマゴ生成判定
→MT 1 つを使用して性格値決定
調整手順は、目標性格値を実現できるよ
うに MT を調整した後、タマゴ生成判定
が受けられるよう LCG を調整
- 29. 個体生成の仕組み
II. i. 第 3 世代固定シンボル
基本スキームは第 4 世代徘徊系と一緒!
性格値下位決定→性格値上位決定
→個体値(H,A,B)決定→個体値(S,C,D)決定
調整手順に行く前に…
第 3 世代に特有の事情の説明を…
- 30. 第 3 世代の乱数事情
第 3 世代の LCG はゲーム起動時からの時間
経過とともに常に更新されている!
実際のゲーム内では 1 秒間に約 60 回程度の
LCG の更新が起こっている
⇒目的となる乱数列の実現は「消費」というよ
り「待機」によって達成される!
- 31. 個体生成の仕組み
II. ii. 第 3 世代野生
基本スキームは第4世代野生と一緒!
諸処理(スロット決定,レベル決定, etc)
→性格決定→性格値探索→個体値決定
ところが!
LID→HID→H,A,B→S,C,D の途中が 1 つ飛ぶ
ことがある!
気を付けよう!
- 32. ここだけの話 ~メソッドズレ~
スキームは性格値探索→個体値決定
諸処理
r[0] 性格決定
r[1] 仮 LID
r[2] 仮 HID
・ ・
・ ・
・ ・
・ ・
r[2n+1] LID
r[2n+2] HID
r[2n+3] 個体値
r[2n+4] 個体値
性格値なかなか決まらないねー(*´・ω・)(・ω・`*)ネー
けっこう時間かかるねー(*´・ω・)(・ω・`*)ネー
VBlank
自分割り込みいいッスかww
LID HID
ここが長くなると時間がかかる!
個体値を決定する処理の呼び出しは時間が
かかるみたいで呼び出してるうちに乱数が
1 つ余分に進むことがある!
⇒メソッド 2, 4 の出現!
- 33. 第 3 世代ループの話
Emの
初期seed
RSの
初期seed
実際に遭遇できる
個体はごくわずか
Em や電池切れ RS では、ゲームを起動し
たときの擬似乱数の初期値が固定されると
いう現象があります
(当然ソフトリセットで起動した際も
同じ初期値になります)
そのため、擬似乱数のシステム上は最大
43 億通りあるはずの個体パターンも、
ゲーム起動直後に遭遇する個体に関しては
数十~数百パターン程度の範囲に収まりま
す
リセット厳選で何度も同じ個体に遭遇して
しまうというループ現象から「エメルー
プ」が命名され、今日の乱数調整に至って
いるという歴史につながります
- 34. 個体生成の仕組み
III. i. 第 5 世代固定シンボル・野生
第 5 世代の生成は基本的に
個体値⇒ MT それ以外⇒ LCG
LCG で色々決めた後、個体値を MT で決めることが多い
スキーム
固定 シンクロ→性格値→性格
野生 シンクロ→スロット→スキップ
→性格値→性格
※第 5 世代以降は性格値と性格に関連なし!
- 36. 個体生成の仕組み
III. ii. 第 5 世代孵化
BW と BW2 で事情が異なる
BW:受け取り時に性格値・個体値・遺伝箇
所がすべて決定される
BW2:前のタマゴを受け取りもしくは破棄し
た時点で次のタマゴの性格・特性・遺伝箇
所・個体値を決める擬似乱数列の初期値が決
定される
- 45. 各世代の特徴
PRNG に 0-99 の評価を要求する場合
第 3 世代:乱数 mod 100
DPt:乱数 / 656
HGSS:乱数 mod 100
第 5 世代:乱数 * 100 の上 2 ケタ
となっていることが多い
- 49. 第 7 世代の乱数事情
孵化乱数
・TinyMT という最近の MT が使われている
卵の受け取りまたは拒否によって乱数が進む
が、乱数計算のもととなる値(seed)について
は更新されるのみで初期化されない
⇒一度 seed を求めてしまえば未来永劫産ま
れてくるタマゴの個体がわかるようになる!
- 50. 第 7 世代の乱数事情
固定乱数
・SFMT という新しい MT が使われている
SFMT はゲームを起動したときに、32bit の
初期 seed によって初期化されている
⇒取りうる初期 seed はたった 43 億通りしか
ないので、総当たり計算で現在の乱数列の元
となった seed を割り出すことができる!