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
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
9
3.7k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.1k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
230
Removing Corepack
yosuke_furukawa
PRO
9
1.6k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
2.8k
Strip Types と Storage
yosuke_furukawa
PRO
4
410
Module Harmony について
yosuke_furukawa
PRO
3
1.7k
LTのやり方
yosuke_furukawa
PRO
16
2.6k
AppRouter Panel Talk
yosuke_furukawa
PRO
3
810
Other Decks in Programming
See All in Programming
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
810
技術同人誌をMCP Serverにしてみた
74th
1
360
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
240
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
410
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
230
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
120
Team operations that are not burdened by SRE
kazatohiei
1
210
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
330
来たるべき 8.0 に備えて React 19 新機能と React Router 固有機能の取捨選択とすり合わせを考える
oukayuka
2
860
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
550
今ならAmazon ECSのサービス間通信をどう選ぶか / Selection of ECS Interservice Communication 2025
tkikuc
20
3.6k
Bytecode Manipulation 으로 생산성 높이기
bigstark
2
380
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Gamification - CAS2011
davidbonilla
81
5.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Bash Introduction
62gerente
614
210k
Rails Girls Zürich Keynote
gr2m
94
14k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
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ʉ
͑ɺͦΕඃരɾɾɾ
ඃര͠ͳ͕ΒཚΛऔΔͷ ࠷ߴʹϩοΫ
"ݪࢠ่֩յͱ͍͏ͱɺ์ࣹઢ ඃΛࢥ͍ු͔ͯ͠·͏͕ɺ ઢྔݶΓͳ͘͘ɺਓମʹ Өڹ͢ΔϨϕϧͰͳ͍ɻ"
·ͱΊ • ཚܯ • ٖࣅཚͷྑ͠ѱ͠ • ϋʔυΣΞཚੜثͱ͍͏ਅͷཚΛ࡞ Δͷ͋Δ • ཚԞਂ͍ɺΈΜͳ৭ʑௐͯΈΔͱָ͍͠