SlideShare uma empresa Scribd logo
1 de 28
乱数のたのしい話
2016/2/5 きしだ なおき
乱数とは
• バラバラな数列
よい乱数
• なるべくバラバラ
• 予測しにくい
• どの数字も同じように出てくる
乱数と圧縮
• 予測できるのであれば予測ルールを使って
数列を省略表記できる
– 圧縮できる
• 理想の乱数
– その数列より短い情報で表現できない
– 圧縮できない
– アルゴリズムで書けない
擬似乱数
• アルゴリズムによって乱数を生成する
• アルゴリズムは乱数列よりも短い
– 圧縮されてる
– 理想の乱数ではない
疑似乱数いろいろ
• 線形合同法
• メルセンヌ・ツイスター
• XorShift
線形合同法
• s = (a × s + b) mod m
• よいところ
– 計算が簡単
– メモリを食わない
• 数値の選び方(周期がmになる)
– m = 2^n
– a = 4 x + 1
– b = 奇数
https://gist.github.com/kishida/96c4abaa266aad76b867
線形合同法の欠点
• 下位ビットに規則性がある
• 多次元で疎に分布
• 周期があまり長くできない
https://gist.github.com/kishida/63dc54a1a01062014339
メルセンヌ・ツイスタ
• 周期がとても長い
– 2^19937-1
– メルセンヌ素数
• 高次元(623次元)に均等分布
• すべてのビットがランダム
• 名前がかっこいい
XorShift
• XorとShiftだけでできる
• 実装簡単
• 周期も長い
• メモリも食わない
疑似ではない乱数
• 神はサイコロを振らない
– アインシュタイン
• 実は神はサイコロを振る
• 量子効果は本質的にランダム
• そこらへんのノイズはランダム
• Linux
– /dev/random
• Core i(Ivy Bridge以降)
– rdrand
乱数をなにに使うか
• ゲーム
• シミュレーション
• ルールの弱点をなくす
• まじめに計算したら答えが出ない問題
シミュレーション
• 現実はいろいろな要素がからんで複雑な動き
をする
• たくさんあると何らかの分布に落ち着く
• その分布に従う乱数を使えばいい
モンテカルロシミュレーション
• まじめに計算するのが面倒なときに、試しに
いろいろな値を与えて計算してみる
• 例:円周率を求める
https://gist.github.com/kishida/725774c83830fb646232
ルールの弱点をなくす
• クイックソート
– 平均計算量 O(n log n)
– ソート済のリストに対してはO(n^2)
quickSort :: Ord a => [a] -> [a]
quickSort [] = []
quickSort (p:xs) = (quickSort less) ++ [p] ++ (quickSort more)
where
less = [ x | x <- xs, x < p ]
more = [ x | x <- xs, p <= x ] (「ふつうのHaskell」より)
ルールの弱点をなくす
• アルゴリズムの弱点がバレると攻撃に
使われる
• クイックソートのピボットをランダムに選ぶ
– 弱いリストが来ることはほとんどありえない
• 乱数を使うけど結果は正しい
– ラスベガスアルゴリズム
まじめに計算したら答えが出ない問題
• 素数かどうか判定する
• 最適化問題
– 焼き鈍し法
– 遺伝アルゴリズム
– ニューラルネットワーク
素数かどうか判定する
• それより小さい数で割ってみる
– 大きさnの数についてnに比例する時間がかかる
– nがm桁のときn = 10^m
– m桁の数について10^mの時間がかかる
• 指数時間
フェルマーテスト
• フェルマーの小定理を使う
– a^(p-1) ≡ 1 (mod p)
– aのp-1乗をpで割った余りは1
• pを素数、aをpの倍数ではない整数(aとpは互いに素)
• nが素数かどうか判定するアルゴリズム
– 適当な数aを選ぶ(2 <= a < n)
– nとaに公倍数があれば合成数
– a ^ (n – 1) mod nが1以外なら合成数
– 何回か違うaで試す
http://d.hatena.ne.jp/nowokay/20081111#1226388552
フェルマーテスト
• たまに間違う
– 合成数と判定されたものは必ず合成数
– 素数と判定されたものがたまに合成数
• 偽素数(カーマイケル数)
• 乱数を使ってたまに間違うアルゴリズム
– モンテカルロアルゴリズム
– 判定のどちらかだけ間違う
• 片側誤りモンテカルロアルゴリズム
http://d.hatena.ne.jp/nowokay/20081111#1226388552
最適化問題
• ある条件に最も近い数値の組み合わせを
求める
• すべての組み合わせを調べることは難しい
最適化問題の解法
• 焼き鈍し法
– シミュレーテッド・アニーリング
• 遺伝アルゴリズム
巡回セールスマン問題
• Travelling Salesman Problem(TSP)
• セールスマンがすべての都市を巡回する
ための最短路を求める
• まじめに計算するとちょう時間がかかる
– n × (n – 1) × (n – 2) × … × 2 × 1
TSPをあてずっぽうに解いてみる
• ランダムに試してみる
• あまり賢くない
https://gist.github.com/kishida/4174b9dc91e92c31b0fa
TSPを遺伝アルゴリズムで解いてみる
• 賢いランダム
• 成績がいいやつを
かけあわせる
https://gist.github.com/kishida/25c2348211c4a4620789
遺伝アルゴリズム
• 遺伝子型と表現型を決める
– 表現型
• 実際に求めたい組み合わせ
• TSPの場合は都市番号
– ex: a -> c -> d -> e -> b -> a
– 遺伝子型
• 遺伝アルゴリズムで表現
しやすい型
• TSPの場合、残りのうち
何番目か
– ex:12221
a
b
e
c
d
遺伝アルゴリズム
• 初期集団を作成
– 遺伝子型をランダムに作成
• 遺伝子をかけあわせる
– ほかの遺伝子とつなぎかえる
• 突然変異
– 一部をランダムに変える
• 淘汰
– 成績いい遺伝子を残す
– 上位だけを残すと過適合するので
下位のものも残るようにする
• 何世代か繰り返す
まとめ
• 乱数を使うと、通常のアルゴリズムでは
解けない問題が解ける
• だいたいいろいろパラメータがある
– 調節はまる
• なんでうまく動くかわからない
– 理解力があったとしても!
• 乱数たのしい!

Mais conteúdo relacionado

Destaque

ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
Yuuki Fukuda
 
クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010
クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010
クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010
なおき きしだ
 
Windows Azureで Webサーバーを再発明してみる
Windows AzureでWebサーバーを再発明してみるWindows AzureでWebサーバーを再発明してみる
Windows Azureで Webサーバーを再発明してみる
Sunao Tomita
 
テスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考える
テスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考えるテスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考える
テスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考える
HIDEKAZU MATSUURA
 

Destaque (20)

NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定するNetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
 
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
 
勉強会に参加しないと不幸になる話
勉強会に参加しないと不幸になる話勉強会に参加しないと不幸になる話
勉強会に参加しないと不幸になる話
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJava
 
機械学習プロ生20151121
機械学習プロ生20151121機械学習プロ生20151121
機械学習プロ生20151121
 
GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)
 
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
 
チーミングを通じて最強のチームを
チーミングを通じて最強のチームをチーミングを通じて最強のチームを
チーミングを通じて最強のチームを
 
Xamarin はじめました
Xamarin はじめましたXamarin はじめました
Xamarin はじめました
 
クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010
クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010
クラウドで変わるJava開発 - Java Cloud Meeting Fukuoka 2010
 
職業人講和20140228
職業人講和20140228職業人講和20140228
職業人講和20140228
 
公開型研修を通して社員一人ひとりの強みや個性を活かす|株式会社富士通ソーシアルサイエンスラボラトリ様の導入事例|アクティブアンドカンパニー
公開型研修を通して社員一人ひとりの強みや個性を活かす|株式会社富士通ソーシアルサイエンスラボラトリ様の導入事例|アクティブアンドカンパニー公開型研修を通して社員一人ひとりの強みや個性を活かす|株式会社富士通ソーシアルサイエンスラボラトリ様の導入事例|アクティブアンドカンパニー
公開型研修を通して社員一人ひとりの強みや個性を活かす|株式会社富士通ソーシアルサイエンスラボラトリ様の導入事例|アクティブアンドカンパニー
 
職業人講和20141007
職業人講和20141007職業人講和20141007
職業人講和20141007
 
UnityとBlenderハンズオン第10章
UnityとBlenderハンズオン第10章UnityとBlenderハンズオン第10章
UnityとBlenderハンズオン第10章
 
プログラマは何を勉強するか
プログラマは何を勉強するかプログラマは何を勉強するか
プログラマは何を勉強するか
 
Windows Azureで Webサーバーを再発明してみる
Windows AzureでWebサーバーを再発明してみるWindows AzureでWebサーバーを再発明してみる
Windows Azureで Webサーバーを再発明してみる
 
テスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考える
テスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考えるテスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考える
テスト設計のタイミングと手法の変更による、品質向上と生産性向上 順序を入れ替え繰り返し考える
 
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
 
人工知能に何ができないか
人工知能に何ができないか人工知能に何ができないか
人工知能に何ができないか
 
これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)これからのコンピューティングとJava(Hacker Tackle)
これからのコンピューティングとJava(Hacker Tackle)
 

Mais de なおき きしだ

GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
なおき きしだ
 
New thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should knowNew thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should know
なおき きしだ
 

Mais de なおき きしだ (19)

GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
 
GraalVM at Fukuoka LT
GraalVM at Fukuoka LTGraalVM at Fukuoka LT
GraalVM at Fukuoka LT
 
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
 
GraalVMについて
GraalVMについてGraalVMについて
GraalVMについて
 
VRカメラが楽しいのでブラウザで見たくなった話
VRカメラが楽しいのでブラウザで見たくなった話VRカメラが楽しいのでブラウザで見たくなった話
VRカメラが楽しいのでブラウザで見たくなった話
 
最近のJava事情
最近のJava事情最近のJava事情
最近のJava事情
 
怖いコードの話 2018/7/18
怖いコードの話 2018/7/18怖いコードの話 2018/7/18
怖いコードの話 2018/7/18
 
Java新機能観察日記 - JJUGナイトセミナー
Java新機能観察日記 - JJUGナイトセミナーJava新機能観察日記 - JJUGナイトセミナー
Java新機能観察日記 - JJUGナイトセミナー
 
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島
 
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11
 
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11
 
Java10 and Java11 at JJUG CCC 2018 Spr
Java10 and Java11 at JJUG CCC 2018 SprJava10 and Java11 at JJUG CCC 2018 Spr
Java10 and Java11 at JJUG CCC 2018 Spr
 
New thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should knowNew thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should know
 
Java Release Model (on Scala Matsuri)
Java Release Model (on Scala Matsuri)Java Release Model (on Scala Matsuri)
Java Release Model (on Scala Matsuri)
 
これからのJava言語と実行環境
これからのJava言語と実行環境これからのJava言語と実行環境
これからのJava言語と実行環境
 
JavaOne報告2017
JavaOne報告2017JavaOne報告2017
JavaOne報告2017
 
JavaOne2017で感じた、Javaのいまと未来 in 大阪
JavaOne2017で感じた、Javaのいまと未来 in 大阪JavaOne2017で感じた、Javaのいまと未来 in 大阪
JavaOne2017で感じた、Javaのいまと未来 in 大阪
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 

乱数のたのしい話