Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
あなたの知らない乱数の世界
Search
Yosuke Furukawa
PRO
August 18, 2017
Programming
0
180
あなたの知らない乱数の世界
リクルートテクノロジーズの社内勉強会で発表した乱数の話です。
Yosuke Furukawa
PRO
August 18, 2017
Tweet
Share
More Decks by Yosuke Furukawa
See All by Yosuke Furukawa
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
150
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
4.4k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.3k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
270
Removing Corepack
yosuke_furukawa
PRO
9
1.7k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
2.9k
Strip Types と Storage
yosuke_furukawa
PRO
4
430
Module Harmony について
yosuke_furukawa
PRO
3
1.8k
LTのやり方
yosuke_furukawa
PRO
16
2.7k
Other Decks in Programming
See All in Programming
スマホから Youtube Shortsを見られないようにする
lemolatoon
27
31k
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
440
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
0
230
Your Perfect Project Setup for Angular @BASTA! 2025 in Mainz
manfredsteyer
PRO
0
170
TFLintカスタムプラグインで始める Terraformコード品質管理
bells17
2
160
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
520
Go言語はstack overflowの夢を見るか?
logica0419
0
240
What's new in Spring Modulith?
olivergierke
1
140
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
480
コードとあなたと私の距離 / The Distance Between Code, You, and I
hiro_y
0
150
Catch Up: Go Style Guide Update
andpad
0
220
CSC509 Lecture 04
javiergs
PRO
0
300
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Why Our Code Smells
bkeepers
PRO
339
57k
Faster Mobile Websites
deanohume
310
31k
Automating Front-end Workflow
addyosmani
1371
200k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Speed Design
sergeychernyshev
32
1.2k
Optimizing for Happiness
mojombo
379
70k
Mobile First: as difficult as doing things right
swwweet
224
10k
RailsConf 2023
tenderlove
30
1.2k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Transcript
͋ͳͨͷΒͳ͍ ཚͷੈք 2017/08/18 @ Recruit Tech Study
ͱཚ
ͦͦͷൃ
ৄ͍͠ܦҢͪ͜ΒΛ
RandඍົʹϥϯμϜ͡Όͳ͍ʁ
͜͜Ͱ͍͏Randͱ • ͓ͦΒ͘ MySQL ͔ Java ͔ͳʹ͔ͷ random ؔʁ •
ͩͱͨ͠ΒϥϯμϜ͡Όͳ͍ͱݴΘͳ͍͕ ࣭ͷѱ͍ϥϯμϜؔͰ͋Δ͜ͱ͔֬ɻ
͜͜Ͱ͍͏Randͱ • ͓ͦΒ͘ MySQL ͔ Java ͔ͳʹ͔ͷ random ؔʁ •
ͩͱͨ͠ΒϥϯμϜ͡Όͳ͍ͱݴΘͳ͍͕ ࣭ͷѱ͍ϥϯμϜؔͰ͋Δ͜ͱ͔֬ɻ ϥϯμϜؔͷ࣭ͱԿ͔ʁ
JavaͰMath.random() ͬͯ·͔͢ʁ
Math.random() ʹද͞ΕΔ ཚൃੜثٙࣅཚͰ͋Γɺ Javaͷٖࣅཚͷ࣮ ઢܗ߹ಉ๏
Javaͷ Math.random ͷΞϧΰ ϦζϜઢܗ߹ಉ๏ • "ܭࢉ୯७͕ͩ͋Μ·ΓϥϯμϜ͡Όͳ͍ཚ ੜث" • X[n+1] =
a * X[n] + b mod M
ઢܗ߹ಉ๏ const A = 1103515245 const B = 12345 const
M = 2^32 var X function rand() { X = (A * X + B) % M return X } // 32,21,18,11,6,17,20,27,32,21,18
ઢܗ߹ಉ๏ const A = 1103515245 const B = 12345 const
M = 2^32 var X function rand() { X = (A * X + B) % M return X } // 32,21,18,11,6,17,20,27,32,21,18 ۮ حͷॱʹฒΜͰΔ
ઢܗ߹ಉ๏ const A = 1103515245 const B = 12345 const
M = 2^32 var X function rand() { X = (A * X + B) % M return X } // 32,21,18,11,6,17,20,27,32,21,18 ۮ حͷॱʹฒΜͰΔ ࠷ॳͷ9<> ॳظ ͕ಉͩͬͨ͡Βඞͣಉ͡ྻ͕࡞ΒΕΔ
ઢܗ߹ಉ๏ const A = 1103515245 const B = 12345 const
M = 2^32 var X function rand() { X = (A * X + B) % M return X } // 32,21,18,11,6,17,20,27,32,21,18 ۮ حͷॱʹฒΜͰΔ ࠷ॳͷ9<> ॳظ ͕ಉͩͬͨ͡Βඞͣಉ͡ྻ͕࡞ΒΕΔ TFFEͱݴ͏
ઢܗ߹ಉ๏ • X[n+1] = a * X[n] + b mod
M • 1 : ۮحͷॱংͰฒͿ • 2 : ࠷ॳͷX[0](ॳظ) ͕ಉͩͬͨ͡Βඞ ͣಉ͡ྻ͕࡞ΒΕΔ
ઢܗ߹ಉ๏ • X[n+1] = a * X[n] + b mod
M • 1 : ۮحͷॱংͰฒͿ • 2 : ࠷ॳͷX[0](ॳظ) ͕ಉͩͬͨ͡Βඞ ͣಉ͡ྻ͕࡞ΒΕΔ ࣍ͷཚ͕༧ଌͰ͖Δɻ ཚʹنଇੑ͕͋Δɻ
ઢܗ߹ಉ๏ • X[n+1] = a * X[n] + b mod
M • 1 : ۮحͷॱংͰฒͿ • 2 : ࠷ॳͷX[0](ॳظ) ͕ಉͩͬͨ͡Βඞ ͣಉ͡ྻ͕࡞ΒΕΔ ࣍ͷཚ͕༧ଌͰ͖Δɻ ཚʹنଇੑ͕͋Δɻ ղ๏ΑΓΑ͍ΞϧΰϦζϜΛબͿ -JLFϝϧηϯψɾπΠελ 9034IJGU
ઢܗ߹ಉ๏ • X[n+1] = a * X[n] + b mod
M • 1 : ۮحͷॱংͰฒͿ • 2 : ࠷ॳͷX[0](ॳظ) ͕ಉͩͬͨ͡Βඞ ͣಉ͡ྻ͕࡞ΒΕΔ TFFEͱճ͔͑͞Ε ࣍ͷཚ͕༧ଌՄೳ
ઢܗ߹ಉ๏ • X[n+1] = a * X[n] + b mod
M • 1 : ۮحͷॱংͰฒͿ • 2 : ࠷ॳͷX[0](ॳظ) ͕ಉͩͬͨ͡Βඞ ͣಉ͡ྻ͕࡞ΒΕΔ TFFEͱճ͔͑͞Ε ࣍ͷཚ͕༧ଌՄೳ ٙࣅཚͱ͍͏ͷجຊ͜͏͍͏ͷ
randomؔͷ࣭ͱ • ٖࣅཚͰ͋Δ߹ɺཚ͕Ұ༷ʹ͢Δ ͜ͱʢಉ͡ࣈ͕ग़ʹ͍͘͜ͱʣ • نଇੑ͕ͳ͍͜ͱʢۮɾح͕ަޓʹग़ͨ Γ͠ͳ͍͜ͱʣ
randomؔͷ࣭ͱ • ٖࣅཚͰ͋Δ߹ɺཚ͕Ұ༷ʹ͢Δ ͜ͱʢಉ͡ࣈ͕ग़ʹ͍͘͜ͱʣ • نଇੑ͕ͳ͍͜ͱʢۮɾح͕ަޓʹग़ͨ Γ͠ͳ͍͜ͱʣ ࣭ͷྑ͍ϥϯμϜؔʢҰ༷ʹཚ͕͠ɺपظੑ͕͘ɺنଇੑ͕ͳ͍ͷʣ ͷྫɿϝϧηϯψɾπΠελɺ9034IJGU
randomؔͷ࣭ͱ • ٖࣅཚͰ͋Δ߹ɺཚ͕Ұ༷ʹ͢Δ ͜ͱʢಉ͡ࣈ͕ग़ʹ͍͘͜ͱʣ • نଇੑ͕ͳ͍͜ͱʢۮɾح͕ަޓʹग़ͨ Γ͠ͳ͍͜ͱʣ ࣭ͷྑ͍ϥϯμϜؔʢҰ༷ʹཚ͕͠ɺपظੑ͕͘ɺنଇੑ͕ͳ͍ͷʣ ͷྫɿϝϧηϯψɾπΠελɺ9034IJGU
randomؔͷ࣭ͱ • ٖࣅཚͰ͋Δ߹ɺཚ͕Ұ༷ʹ͢Δ ͜ͱʢಉ͡ࣈ͕ग़ʹ͍͘͜ͱʣ • نଇੑ͕ͳ͍͜ͱʢۮɾح͕ަޓʹग़ͨ Γ͠ͳ͍͜ͱʣ ࣭ͷྑ͍ϥϯμϜؔʢҰ༷ʹཚ͕͠ɺपظੑ͕͘ɺنଇੑ͕ͳ͍ͷʣ ͷྫɿϝϧηϯψɾπΠελɺ9034IJGU ͪͳΈʹ7ͷ.BUISBOEPN
͜ͷ9034IJGU
͞Βʹຊ
ݫີʹϥϯμϜͳrandomؔͱ͔ͳ͍?
ຊͩΖ͏͔ʁ
ٙࣅ͡Όͳ͍ཚ͋Δ • ϋʔυΣΞཚੜثʢӳޠͩͱTrue Random Number Generator TRNG) • /dev/random •
ࡶԻ • ์ࣹੑ࣭ͷ่յ • ͳͲͳͲɺଞʹͨ͘͞Μ͋Δ
/dev/random ΩʔϘʔυϚεɺσΟεΫૢ࡞ͱ͍ͬͨૢ࡞هΛݩʹ৭Μͳ ใΛஷΊ͓͖ͯɺ͔ͦ͜ΒϥϯμϚΠζ͞ΕͨใΛग़͢
/dev/random ΩʔϘʔυϚεɺσΟεΫૢ࡞ͱ͍ͬͨૢ࡞هΛݩʹ৭Μͳ ใΛஷΊ͓͖ͯɺ͔ͦ͜ΒϥϯμϚΠζ͞ΕͨใΛग़͢ ૢ࡞ه͕Ұఆஷ·Βͳ͍ͱ ػೳ͠ͳ͍
ࡶԻΛͬͨํ๏ ిؾճ࿏Ͱ0/Ͱ0''Ͱͳ͍ঢ়گΛ࡞͓ͬͯ͘ɻ ͦͷ্ͰࡶԻͱ͍͏ཧݱΛͬͯPS͕ϥϯμϜʹग़ΔΑ͏ʹ͢Δɻ )JHI )JHI
ࡶԻΛͬͨํ๏ *OUFM*WZ#SJEHFʹ࣮ࡁΈɻ
ࡶԻΛͬͨํ๏ *OUFM*WZ#SJEHFʹ࣮ࡁΈɻ ͨͩ͠ɺࡶԻʹΑΔํ๏ిྗফඅྔ͕ܹ͍͠ ΤωϧΪʔ͕খ͗ͯ͢͞ภΓ͕͋ΔɺͦͷͨΊιϑτΣΞͷิॿ͕ඞཁ
ݪࢠ่֩յΛͬͨํ๏
ݪࢠ่֩յΛͬͨํ๏ ”70ஹݸͷݪࢠͷݪࢠ่֩յΛར༻ͨ͠ͷͰɺߏ୯७ɻ” ”ઢݯͷۙ͘ʹμΠΦʔυΛઃஔ͠ɺ͜͜ͰύϧεΛݕ͢Δɻ”
ݪࢠ่֩յΛͬͨํ๏ ”70ஹݸͷݪࢠͷݪࢠ่֩յΛར༻ͨ͠ͷͰɺߏ୯७ɻ” ”ઢݯͷۙ͘ʹμΠΦʔυΛઃஔ͠ɺ͜͜ͰύϧεΛݕ͢Δɻ”
ʊਓਓਓਓਓʊ ʼɹύϧεɹʻ ʉY^Y^Y^Yʉ
͑ɺͦΕඃരɾɾɾ
ඃര͠ͳ͕ΒཚΛऔΔͷ ࠷ߴʹϩοΫ
"ݪࢠ่֩յͱ͍͏ͱɺ์ࣹઢ ඃΛࢥ͍ු͔ͯ͠·͏͕ɺ ઢྔݶΓͳ͘͘ɺਓମʹ Өڹ͢ΔϨϕϧͰͳ͍ɻ"
·ͱΊ • ཚܯ • ٖࣅཚͷྑ͠ѱ͠ • ϋʔυΣΞཚੜثͱ͍͏ਅͷཚΛ࡞ Δͷ͋Δ • ཚԞਂ͍ɺΈΜͳ৭ʑௐͯΈΔͱָ͍͠