Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
乱数調整入門
みなさん, こんにちは
自己紹介
HN: mizdra
学域1年生Ⅰ類CSプログラム
趣味: プログラミング, ポケモン, 乱数ツールの作成
サン買ったよ!
今日のお話
今日はポケモンと乱数調整の話です
実際に乱数調整をやるところまで
話すことが沢山あるので急ぎます!
乱数調整とは
「 次に得られる乱数を予測し, 狙った乱数を得ること」
「 ランダムな事象を予測し, 狙った事象を発生させること」といっ
たようにもっと広義的に捉えられる場合も
例
サイコロを11回振ってた時, 何かしらの手法を使って今まで得
ら...
そもそも乱数って何?
「サイコロの出目のように規則性がなく予測不能な数」
乱数列はそれ以前の数から次の数を予測することが出来ない
先程のサイコロの出目の例
n回目 1 2 3 4 5 6 7 8 9 10 11 12
出目 1 3 4 3 2 ...
コンピュータで乱数を扱う方法
S[0] = 0
S[n+1] = (3 * S[n] + 5) % 7
S = { 5, 6, 2, 4, 3, 0, 5, 6, 2, 4, 3, ... }
「線形合同法(LCG)」と呼ばれる漸化式を用いた簡...
ポケモンで使用される乱数生成法
frame := フレーム (0 < frame)
year := 年 (2000 ≦ year ≦ 2099)
month := 月 (1 ≦ month ≦ 12)
day := 日 (1 ≦ day ≦ 3...
実擬似乱数列
以下はハートゴールドで使用されているLCG
S[n+1] = (0x41C64E6D * S[n] + 0x6073) % 0x100000000
 0x41C64E6D ,  0x6073 は両方とも奇数であることに注目.
 奇...
乱数の消費
新しい乱数が生成されたとき, 「乱数が消費された」と言う
乱数が2度生成された場合は2回乱数が消費され, 「乱数が2消費され
た」「2F消費された」といった表現が用いられます
代表的な乱数消費法
消費
数 事象
1
ウツギ博士に電話を掛ける(通話内容の決定で乱数が消費され
る)
1
NPCが振り向く/移動する(NPCが振り向く向き, 静止時間の決
定)
1 ペラップの鳴き声を聞く(聞く度に音の高さが変わる)
ここまで長かった
乱数調整の原理の説明はこれで終わりです
次は乱数調整を実際にやっていきます
今回は「ウツギ博士に電話をかける」(ウツギ
博士乱数)ことについて乱数調整してみる
ウツギ博士乱数‑ 原理
電話をする度に r[n] % 3 で対応するメッセージが決定される
 r[n] % 3  メッセージ(先頭のみ)
0 ポケモンのしんかというのは~
1 カントーにはまだぼくの~
2 ポケルスがくっついた~
対応表
n  S[n]   r[n] 
 r[n] %
3 
メッセージ(先頭のみ)
0 0x500305BA 0x5003 2 ポケルスがくっついた~
1 0xA4E47CA5 0xA4E4 2 ポケルスがくっついた~
2 0x1FE1B8B...
ウツギ博士乱数‑ やりたいこと
ウツギ博士への電話で「ポケモンのしんかというのは~」というメ
ッセージを16回連続で話してもらいたい
目的のメッセージを15回以上連続で話す乱数 S[n] , 及びその初期
Seedを計算する必要がある
本来であ...
ではどうするか
無いなら作ってしまいば良いのですよ
作った
https://gist.github.com/mizdra/faf3c48f67d999fc8072795e6c6
7a901
目的の乱数と初期Seed, 必要な消費数を出力するプログラム
C++で100行くらいで書けます
$ ./A...
ウツギ博士乱数‑ ゲームの起動
以下を元に初期Seed 0x89070502 に合わせるためのゲームの起動
時刻を計算する
frame := フレーム (0 < frame)
year := 年 (2000 ≦ year ≦ 2099)
mon...
ウツギ博士乱数‑ 乱数の消費
ゲームを再開したらウツギ博士に電話を掛け, 16連続で同じメッセ
ージを話してくれるか確認する
対応表と比較して電話のメッセージが予想と異なれば初期Seedが間
違っている可能性がある
ゲームの起動からやり直し
ゲ...
対応表
n  S[n]   r[n] % 3  メッセージ(先頭のみ)
0 0x89070502 0 ポケモンのしんかというのは~
1 0xDD101E4D 0 ポケモンのしんかというのは~
2 0x05A6BD3C 0 ポケモンのしんかという...
n  S[n]   r[n] % 3  メッセージ(先頭のみ)
10 0x41FD5EC4 0 ポケモンのしんかというのは~
11 0x5B5971E7 0 ポケモンのしんかというのは~
12 0xE57441CE 0 ポケモンのしんかというの...
動画もあるよ
https://youtube.com/watch?v=P2hi9fgGhe4
8回目でやっとできました
おわり
宣伝
PokémonRNG Advent Calendar 2016の主催やってます
乱数調整で色違いのポケモンを捕獲する方法
各世代(第三世代, 第四世代, ...)での乱数事情
解析されていないランダムな事象の調査
あと1枠!!!!!
マイナーな分野でそれに関わる人も少ないので埋まりそうで驚いて
いる
サン・ムーンの孵化乱数調整が絶賛解析中でそれ関連の記事が大量
に生成された
めでたい
乱数調整 入門
乱数調整 入門
Upcoming SlideShare
Loading in …5
×

乱数調整 入門

3,224 views

Published on

LT & Recreation Party - Exciting party among MCC & MMA & NCC の飛び入りLTで使ったスライドです

https://github.com/MicroComputerClub/MCCMMANCC2016

Published in: Engineering
  • Be the first to comment

乱数調整 入門

  1. 1. 乱数調整入門
  2. 2. みなさん, こんにちは
  3. 3. 自己紹介 HN: mizdra 学域1年生Ⅰ類CSプログラム 趣味: プログラミング, ポケモン, 乱数ツールの作成 サン買ったよ!
  4. 4. 今日のお話 今日はポケモンと乱数調整の話です 実際に乱数調整をやるところまで 話すことが沢山あるので急ぎます!
  5. 5. 乱数調整とは 「 次に得られる乱数を予測し, 狙った乱数を得ること」 「 ランダムな事象を予測し, 狙った事象を発生させること」といっ たようにもっと広義的に捉えられる場合も 例 サイコロを11回振ってた時, 何かしらの手法を使って今まで得 られた出目から12回目の出目を予測する n回目 1 2 3 4 5 6 7 8 9 10 11 12 出目 1 3 4 3 2 6 1 5 4 2 4 ???
  6. 6. そもそも乱数って何? 「サイコロの出目のように規則性がなく予測不能な数」 乱数列はそれ以前の数から次の数を予測することが出来ない 先程のサイコロの出目の例 n回目 1 2 3 4 5 6 7 8 9 10 11 12 出目 1 3 4 3 2 6 1 5 4 2 4 ???
  7. 7. コンピュータで乱数を扱う方法 S[0] = 0 S[n+1] = (3 * S[n] + 5) % 7 S = { 5, 6, 2, 4, 3, 0, 5, 6, 2, 4, 3, ... } 「線形合同法(LCG)」と呼ばれる漸化式を用いた簡易的な乱数生成 法の1つ コンピュータ単独では確定的な計算することができない 確定的な計算によって乱数を生成する ポケモン(ハートゴールド・ソウルシルバー)ではこの乱数生成法が 用いられている
  8. 8. ポケモンで使用される乱数生成法 frame := フレーム (0 < frame) year := 年 (2000 ≦ year ≦ 2099) month := 月 (1 ≦ month ≦ 12) day := 日 (1 ≦ day ≦ 31) hour := 時間 (0 ≦ hour ≦ 23) minute := 分 (0 ≦ minute ≦ 59) second := 秒 (0 ≦ second ≦ 59) # 初期Seedの計算方法 S[0] = (((month * day + minute + second) * 0x1000000) + (hour * 0x10000) + (frame + year - 2000)) % 0x100000000 # 漸化式 S[n+1] = (0x41C64E6D * S[n] + 0x6073) % 0x100000000  frame はDSを起動してソフトを選択し, ゲームが起動した瞬間か ら「つづきからはじめる」を押した瞬間までの時間をフレーム
  9. 9. 実擬似乱数列 以下はハートゴールドで使用されているLCG S[n+1] = (0x41C64E6D * S[n] + 0x6073) % 0x100000000  0x41C64E6D ,  0x6073 は両方とも奇数であることに注目.  奇数*偶数+奇数 は奇数  奇数*奇数+奇数 は偶数  偶数, 奇数, 偶数, 奇数, ... を繰り返す 生のまま使用すると大きな偏りが生じてしまうので実擬似乱数列 r[n] = S[n] >>> 16 を利用
  10. 10. 乱数の消費 新しい乱数が生成されたとき, 「乱数が消費された」と言う 乱数が2度生成された場合は2回乱数が消費され, 「乱数が2消費され た」「2F消費された」といった表現が用いられます
  11. 11. 代表的な乱数消費法 消費 数 事象 1 ウツギ博士に電話を掛ける(通話内容の決定で乱数が消費され る) 1 NPCが振り向く/移動する(NPCが振り向く向き, 静止時間の決 定) 1 ペラップの鳴き声を聞く(聞く度に音の高さが変わる)
  12. 12. ここまで長かった
  13. 13. 乱数調整の原理の説明はこれで終わりです
  14. 14. 次は乱数調整を実際にやっていきます
  15. 15. 今回は「ウツギ博士に電話をかける」(ウツギ 博士乱数)ことについて乱数調整してみる
  16. 16. ウツギ博士乱数‑ 原理 電話をする度に r[n] % 3 で対応するメッセージが決定される  r[n] % 3  メッセージ(先頭のみ) 0 ポケモンのしんかというのは~ 1 カントーにはまだぼくの~ 2 ポケルスがくっついた~
  17. 17. 対応表 n  S[n]   r[n]   r[n] % 3  メッセージ(先頭のみ) 0 0x500305BA 0x5003 2 ポケルスがくっついた~ 1 0xA4E47CA5 0xA4E4 2 ポケルスがくっついた~ 2 0x1FE1B8B4 0x1FE1 1 カントーにはまだぼく の~ 3 0xE89ADD17 0xE89A 2 ポケルスがくっついた~ 4 0x1017853E 0x1017 0 ポケモンのしんかという のは~
  18. 18. ウツギ博士乱数‑ やりたいこと ウツギ博士への電話で「ポケモンのしんかというのは~」というメ ッセージを16回連続で話してもらいたい 目的のメッセージを15回以上連続で話す乱数 S[n] , 及びその初期 Seedを計算する必要がある 本来であれば既存ツールを利用してこれらを検索する
  19. 19. ではどうするか
  20. 20. 無いなら作ってしまいば良いのですよ
  21. 21. 作った https://gist.github.com/mizdra/faf3c48f67d999fc8072795e6c6 7a901 目的の乱数と初期Seed, 必要な消費数を出力するプログラム C++で100行くらいで書けます $ ./AbuseDrUtsugi.exe n S[n] S[0] 10 0X23E5E254 0XD2160812 5 0X2A991401 0X89070502 9 0X3B4F3C64 0X96010A6D 4 0X72038E62 0X4114049E 5 0X7B215E11 0XE8040852 6 0X810C32E0 0X89070502 ←これを狙う 5 0XA2B1DC2D 0X4114049E
  22. 22. ウツギ博士乱数‑ ゲームの起動 以下を元に初期Seed 0x89070502 に合わせるためのゲームの起動 時刻を計算する frame := フレーム (0 < frame) year := 年 (2000 ≦ year ≦ 2099) month := 月 (1 ≦ month ≦ 12) day := 日 (1 ≦ day ≦ 31) hour := 時間 (0 ≦ hour ≦ 23) minute := 分 (0 ≦ minute ≦ 59) second := 秒 (0 ≦ second ≦ 59) DSメニューからゲームを選択: 2099年5月20日7時2分10秒 待機時間: 1533F 「つづきからはじめる」を選択: 2099年5月20日7時2分35秒 待機時間はタイマーを使って気合で合わせます
  23. 23. ウツギ博士乱数‑ 乱数の消費 ゲームを再開したらウツギ博士に電話を掛け, 16連続で同じメッセ ージを話してくれるか確認する 対応表と比較して電話のメッセージが予想と異なれば初期Seedが間 違っている可能性がある ゲームの起動からやり直し ゲーム再開時に自動で数F乱数が消費されるので注意する
  24. 24. 対応表 n  S[n]   r[n] % 3  メッセージ(先頭のみ) 0 0x89070502 0 ポケモンのしんかというのは~ 1 0xDD101E4D 0 ポケモンのしんかというのは~ 2 0x05A6BD3C 0 ポケモンのしんかというのは~ 3 0xCE0F3AFF 2 ポケルスがくっついた~ 4 0xC0B03106 2 ポケルスがくっついた~ 5 0x2A991401 0 ポケモンのしんかというのは~ 6 0x810C32E0 0 ポケモンのしんかというのは~ 7 0xE2F249D3 0 ポケモンのしんかというのは~ 8 0x1FDA194A 0 ポケモンのしんかというのは~ 9 0x5CCDB0F5 0 ポケモンのしんかというのは~
  25. 25. n  S[n]   r[n] % 3  メッセージ(先頭のみ) 10 0x41FD5EC4 0 ポケモンのしんかというのは~ 11 0x5B5971E7 0 ポケモンのしんかというのは~ 12 0xE57441CE 0 ポケモンのしんかというのは~ 13 0x51E12929 0 ポケモンのしんかというのは~ 14 0xB61F64E8 0 ポケモンのしんかというのは~ 15 0x0F8D073B 0 ポケモンのしんかというのは~ 16 0x29E26E92 0 ポケモンのしんかというのは~ 17 0x6A05F09D 0 ポケモンのしんかというのは~ 18 0xEA45A94C 0 ポケモンのしんかというのは~ 19 0x36069DCF 0 ポケモンのしんかというのは~ 20 0xA200A396 0 ポケモンのしんかというのは~ 21 0xC821BB51 2 ポケルスがくっついた~
  26. 26. 動画もあるよ https://youtube.com/watch?v=P2hi9fgGhe4 8回目でやっとできました
  27. 27. おわり
  28. 28. 宣伝 PokémonRNG Advent Calendar 2016の主催やってます 乱数調整で色違いのポケモンを捕獲する方法 各世代(第三世代, 第四世代, ...)での乱数事情 解析されていないランダムな事象の調査
  29. 29. あと1枠!!!!! マイナーな分野でそれに関わる人も少ないので埋まりそうで驚いて いる サン・ムーンの孵化乱数調整が絶賛解析中でそれ関連の記事が大量 に生成された めでたい

×