SlideShare a Scribd company logo
ゲーム向きな美味しい乱数を生成する
自己紹介
 ai(@ai_9684_dct)
 工学部
 声豚
 ヨナヨナ声優ラジオの実況してる奇怪な豚
 Blogやってます
 でるでる詐欺してたけど漸く初参加
 最近はUnrealEngine4を触っている
ゲームにおける乱数
 ダメージ計算
ゲームにおける乱数
 ダメージ計算
ゲームにおける乱数
 サイコロ
ゲームにおける乱数
 サイコロ
ゲームにおける乱数
 ドロップアイテム
ゲームにおける乱数
 ドロップアイテム
ゲームにおける乱数
 ガチャ
ゲームにおける乱数
 ガチャ
ゲームと乱数は密接な関係にある
 ロジェ・カイヨワ著の遊びについ
て研究した本
 ソラの桜井政博やゲームフリーク
などがインタビューで度々話題に
している名著
 ゲーム、エンタメ業界を目指す人
は読んでおくといいかも
遊びの定義
アゴン(競争) アレア(偶然)
イリンクス(目眩)ミミクリ(模倣)
遊びの定義
 アゴン(競争) 対戦、テーブルゲーム、スポーツ競技
 アレア(偶然) ギャンブル、じゃんけん、サイコロ
 ミミクリ(模倣) ごっこ遊び、演劇、TRPG、シミュレーショ
ンゲーム
 イリンクス(目眩) ジェットコースター、ブランコ、バンジー
ジャンプ
遊びの定義
アゴン(競争) アレア(偶然)
イリンクス(目眩)ミミクリ(模倣)
遊びの定義
アゴン(競争) アレア(偶然)
イリンクス(目眩)ミミクリ(模倣)
乱数はこれと密接に関わっている
余談
みんなだいすきガチャの話
 アゴン(競争) → レアを引いた時(ド(・8・)ブ)った時
SNSで報告しマウントを取り合う
 アレア(偶然) → ガチャは偶然、確率の塊
 ミミクリ(模倣) → FGOならマスター、デレステならPの気
持ちになれる
 イリンクス(目眩)
みんなだいすきガチャの話
 アゴン(競争) → レアを引いた時(ド(・8・)ブ)った時
SNSで報告しマウントを取り合う
 アレア(偶然) → ガチャは偶然、確率の塊
 ミミクリ(模倣) → FGOならマスター、デレステならPの気
持ちになれる
 イリンクス(目眩)
ガチャは全ての要素を非常に端的に含んでいる
アゴン(競争) アレア(偶然)
イリンクス(目眩)ミミクリ(模倣)
ガチャが面白いのは
当然の摂理である
Q.E.D.
余談おわり
コンピューター上の乱数発生
 いわゆる一様乱数(すべて同じ確率で出現する)
は現実世界だとサイコロを振って出た目などで生
成する
 規則性も再現性もあってはならない
 コンピュータだと現実世界と同様な一様乱数を発
生させることは(多分)不可能
じゃあどうするの?
それっぽいもので妥協する
擬似乱数生成方法
 平方採中法 (middle-square method)
ノイマンが提案したらしい
 線形合同法 (linear congruential method)
 メルセンヌ・ツイスタ
 カオス乱数
 Lagged Fibonacci 法(ラグ付フィボナッチ法)
線形合同法
線形合同法
線形合同法
周期3
→使い物にならない!
線形合同法の弱点
 再現が容易
 周期が短くなりがち
 下位1bitが0と1が交互に出る(偶奇が交互に
出る)
ノイマン
「漸化式で乱数を作る
のはある種の罪」
線形合同法はう○こ
でも
 C言語のrand()やJava.util.Randomは線形合同法を
使っているのでビンゴゲームとかでこれを使って
はならない
 サイコロの目をrand() % 6 + 1とかで表現するとか
やってはいけない
 まあC言語はちょっと古い言語なのでゆるそう
J
a
v
a
メルセンヌ・ツイスタ法
 1996年日本人が開発した乱数
 アルゴリズムは公開されている
 C++,Ruby,R,PHP,MATLAB,C++11以降では標準ライブラリに
取り入れられている
 比較的軽い
 早い
 めっちゃそれっぽい
 周期219937-1(10進数で6千兆桁以上) と証
明済
メルセンヌ・ツイスタ法
 アルゴリズムは省略
 てか説明できるほどの時間も数学力もない
 Wikipediaやら開発者の論文見て
メルセンヌ・ツイスタ法の弱点
 この乱数発生手法は一般的
 しかしこれも初期Seedを特定されると割と簡単に
再現できる
 現にポケモンがMT法を採用しているがポケモンウ
ルトラサン・ムーンが発売前に解析され狙ったポ
ケモンの色違いが出せるツールが開発された
 そしてその情報を拡散するぽけりんとかいうまと
めサイト
ぽ
け
り
ん
それはそれとして
ゲームで使う乱数
再現可能
で、目的に沿った乱数であるべき
再現不可能
主にMT法のアルゴリズムを使って擬似的に一様乱数
を生成し、その上で
ゲームで使う乱数
再現可能
で、目的に沿った乱数であるべき
再現不可能
主にMT法のアルゴリズムを使って擬似的に一様乱数
を生成し、その上で
プレイヤーが予測不可能でなければならない
ゲームで使う乱数
再現可能
で、目的に沿った乱数であるべき
再現不可能
主にMT法のアルゴリズムを使って擬似的に一様乱数
を生成し、その上で
プレイヤーが予測不可能でなければならない
アレア(偶然)でなければ
遊びの面白さが低減
再現させるには
初期Seedを固定する
再現させたくなければ
起動時間、システムクロック、ボタンを押した回
数等でSeedを変化させる
MT法確立前(DQ1を例に)
 初期Seedにゲームの起動開始からの時間を使って
いる
 ユーザーが容易に再現可能
 うまく利用すれば毎回敵を会心の一撃で倒すこと
も可能
 結果TASで45分という異常な結果が出ている
他にも
 Linuxはキーボードのタイピング間隔、マウスのス
クロール速度等予測しづらいイベントを測定して
それをカーネルに溜め込んでるらしい
様々な乱数
 正規分布に従う乱数(正規乱数)
標準正規分布(平均0,分散1)の確率密度関数グラフ
例えば
 正規分布に従う乱数(正規乱数)
平均に近い値が高い確率で出現する乱数
→あるステージでLv.25に近い敵を多く出現させたいetcに応用可能?
現実で観測されるランダムな事象は何度も起こすと正規分布に近似
していく(大数の法則、中心極限定理とかほにゃららな理由で)
上記の理由から人間は正規乱数をそれらしい乱数であると認識しが
ち(認知バイアスの問題)
正規乱数を生成する
 方法1:大数の法則を利用する
 方法2:逆関数法
方法1:大数の法則を利用する
大数の法則をざっくり言うと
任意の分布を持つサンプルを無限に増やし
たその平均は正規分布に限りなく近づく
方法1:大数の法則を利用する
= ( random() + random() + random() + random() + random() )
/ 5.0f
一様乱数を5個取ってきて平均を取る
→これだけで正規乱数っぽくなる
方法1:大数の法則を利用する
= ( random() + random() + random() + random() + random() )
/ 5.0f
一様乱数を5個取ってきて平均を取る
→これだけで正規乱数っぽくなる
これはあくまで正規分布にちょっとだけ従っている乱数
→それがゲームの世界なら良かったりする(コクがある)
方法1:大数の法則を利用する
 足す乱数の数を増やしていくとより正規分布に近
似していく
 色々実験してみて目的のそれっぽい乱数を生成し
てみよう
方法2:逆関数法
 逆関数法の内のbox-Muller法を使用(逆関数法の
詳しい説明は省略)
 一様乱数から標準正規分布を生成可能
方法2:逆関数法
 逆関数法の内のBox-Muller法を使用(逆関数法の
詳しい説明は省略)
 一様乱数から標準正規分布を生成可能
X,Yを互いに独立で(0,1)区間での一様分布に従う確率
変数とすると以下の式で定義されるZ1,Z2は標準正規
分布となる。
方法2:逆関数法
 Box-Muller法は実用ではめったに使われないらしい
様々な乱数
 パーリンノイズ
 Ken Perlinが映画のCG技術として開発した。
 アカデミー科学技術賞受賞
 地形、炎、雲等のテクスチャ作成に応用されている
パーリンノイズ
 Minecraftやオープンワールドの自動地形生成技術に応用
されている
パーリンノイズ
 とはいえパーリンノイズもいろんなところで利用されている
 養殖モノの乱数は美味しくない
 足したり掛けたり割ったりしてまろやかで奥行きのある味を
出したほうがいい
 たくさん実験して知見を深めよう
その他の乱数生成方法
 人のいない森の奥で生成する
 実際やってみる(車の振動とか鳥の鳴き声とか…)
 物理最強
 しかし周期性があると気づかれてはならないのでざっと数兆
回くらいはやらないと違和感を覚えられるかも
 興味ある人はやってみて(私はやらない)
まとめ
 ゲーム作る時適当にrand()使うと痛い目見るよー
 乱数作る時は初期Seedに気をつけようねー
 本来の一様乱数と人間が思ってる乱数は結構違うよー
 乱数を足したり掛けたりするだけでも面白い結果が得られる
よー
 色々実験してコクのある乱数を生成してみよー
 コクのある乱数を使ってユーザーにとってのリスクとリター
ンを制御していけば面白いゲームできるかもねー
参考資料
 https://togetter.com/li/1044668?page=2
 http://fladdict.net/blog/2014/10/visual-coding-1.html
 https://qiita.com/Ushio/items/63684b56a58704c73824
 https://www.slideshare.net/UnityTechnologiesJapan/unity-2017-81056841
 http://k11i.biz/blog/2016/11/05/approximate-gaussian-rng/
 http://news.denfaminicogamer.jp/kikakuthetower/171130b/3
 https://note.mu/ruiu/n/nb5c3fe7e4e7d

More Related Content

PDF
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
PDF
UE4におけるキャラクタークラス設計
PDF
出張ヒストリア ブループリントを書くにあたって大切なこと
PDF
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
PDF
UE4とUnrealC++について
PDF
UE4で作成するUIと最適化手法
PDF
わからないまま使っている?UE4 の AI の基本的なこと
PDF
UE4でマルチプレイヤーゲームを作ろう
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
UE4におけるキャラクタークラス設計
出張ヒストリア ブループリントを書くにあたって大切なこと
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
UE4とUnrealC++について
UE4で作成するUIと最適化手法
わからないまま使っている?UE4 の AI の基本的なこと
UE4でマルチプレイヤーゲームを作ろう

What's hot (20)

PDF
UE4を使った映像制作 (UE4 Character Art Dive Online)
PDF
UE4における大規模背景制作事例(データメンテナンス・大技設定編 )
PDF
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
PDF
かわいい女の子になりたいんや! UE4の最新機能を使ってVTuberしてみた!
PDF
【Unite Tokyo 2019】SRPで一から描画フローを作ってみた! ~Unity描画フローからの脱却~
PPTX
UE4のためのより良いゲーム設計を理解しよう!
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
PDF
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
PDF
UE4を用いた人間から狼男への変身表現法の解説
PDF
UE4における大規模背景制作事例(コリジョン編)
PPTX
UE4のスレッドの流れと Input Latency改善の仕組み
PDF
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
PDF
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
PDF
UE4勉強会 in 大阪 - もっとアニメーションBP
PDF
猫でも分かる UE4の新しいサンプル「Action RPG」について
PDF
Unity開発で使える設計の話+Zenjectの紹介
PDF
【UE4.25 新機能】新しいシリアライゼーション機能「Unversioned Property Serialization」について
PDF
Unreal Engine 4を使って地球を衛る方法
PDF
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
UE4を使った映像制作 (UE4 Character Art Dive Online)
UE4における大規模背景制作事例(データメンテナンス・大技設定編 )
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
かわいい女の子になりたいんや! UE4の最新機能を使ってVTuberしてみた!
【Unite Tokyo 2019】SRPで一から描画フローを作ってみた! ~Unity描画フローからの脱却~
UE4のためのより良いゲーム設計を理解しよう!
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4を用いた人間から狼男への変身表現法の解説
UE4における大規模背景制作事例(コリジョン編)
UE4のスレッドの流れと Input Latency改善の仕組み
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
UE4勉強会 in 大阪 - もっとアニメーションBP
猫でも分かる UE4の新しいサンプル「Action RPG」について
Unity開発で使える設計の話+Zenjectの紹介
【UE4.25 新機能】新しいシリアライゼーション機能「Unversioned Property Serialization」について
Unreal Engine 4を使って地球を衛る方法
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
Ad

More from ai BlogOnly (6)

PPTX
声優ラジオ入門
PPTX
私的声優まとめ
PPTX
UE4超初心者向けチュートリアルスライド(2)
PPTX
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
PPTX
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
PPTX
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
声優ラジオ入門
私的声優まとめ
UE4超初心者向けチュートリアルスライド(2)
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
Ad

ゲーム向けな美味しい乱数を生成する(再アップ版)