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
Rando
Search
Tim Uruski
May 14, 2014
Programming
0
110
Rando
A lightning talk in which we learn a bit about Ruby by working with random values.
Tim Uruski
May 14, 2014
Tweet
Share
More Decks by Tim Uruski
See All by Tim Uruski
Exceptional Ruby
timuruski
0
79
Structure and Interpretation of Ruby Programs
timuruski
1
190
Rack and Middleware
timuruski
0
150
From Whence Rubygems - Mark 2
timuruski
0
130
The Waiting Game
timuruski
0
79
From Whence Rubygems
timuruski
1
78
Other Decks in Programming
See All in Programming
MicrosoftのPlatform Engineeringガイドを読んで実際になにかやってみた
ymd65536
1
230
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
TYPO3 v13 – The road to LTS: What's new and new APIs
luisasofie_xoxo
0
190
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
130
Micro Frontends for Java Microservices - Devnexus 2024
mraible
PRO
0
470
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
220
Anthropic Cookbook のおすすめレシピ
schroneko
6
600
Milestoner
bkuhlmann
1
410
Site Reliability Engineering for GMO
pyama86
7
1k
StoreKit2によるiOSのアプリ内課金のリニューアル
kangnux
0
110
Rethinking UI building strategies @ SFI 2024
letelete
0
270
Changed Rules: Architectures with Lightweight Stores
manfredsteyer
PRO
0
240
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
The Invisible Customer
myddelton
114
12k
Web development in the modern age
philhawksworth
202
10k
For a Future-Friendly Web
brad_frost
171
8.9k
No one is an island. Learnings from fostering a developers community.
thoeni
15
2.1k
Faster Mobile Websites
deanohume
298
30k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
From Idea to $5000 a Month in 5 Months
shpigford
377
45k
The Mythical Team-Month
searls
215
42k
Build The Right Thing And Hit Your Dates
maggiecrowley
23
2k
Fireside Chat
paigeccino
20
2.6k
The Brand Is Dead. Long Live the Brand.
mthomps
48
28k
Transcript
Rando # Ruby v2.1.1 Random.srand 123 1
four random things 2
pick a random number between 100 and 200 3
(rand * 100 + 100).to_i => 169 4
(rand * 100 + 100).to_i => 169 NO! 5
rand(100..200) => 166 6
rand(*args) 7
how many kinds of random does Ruby have? 8
ObjectSpace .each_object .select { |obj| obj.respond_to?(:rand) } 9
Kernel Random #<Random:0x007fed39068820> 10
Kernel Random #<Random:0x007fed39068820> Random::DEFAULT => #<Random:0x007fed39068820> 11
Kernel Random #<Random:0x007fed39068820> 12
rand == Kernel.rand Random.rand == Random::DEFAULT.rand Kernel.rand != Random.rand 13
Kernel.rand => 0.6964691855978616 Random.rand => 0.6964691855978616 14
Kernel.rand(100) => 66 Random.rand(100) => 66 15
Kernel.rand(0..100) => 66 Random.rand(0..100) => 66 16
Kernel.rand(100.0) => 66 Random.rand(100.0) => 69.64691855978616 17
Kernel.rand(-100.0) => 66 Random.rand(-100.0) => ArgumentError 18
know your rand 19
generate a list of random numbers 20
(0..20).map { rand } => [0.696469, 0.286139, ...] 21
(0..20).map { rand } => [0.696469, 0.286139, ...] NO! 22
Array.new(20) { rand } => [0.696469, 0.286139, ...] 23
Array.new(*args) 24
Array.new(size, obj, &generator) 25
Array.new(3) => [nil, nil, nil] 26
Array.new(3, 0) => [0, 0, 0] 27
Array.new(3) { |n| n } => [0, 1, 2] 28
know your primitives 29
pick a random subset of elements from an array 30
users = %w[alice bob carol] subset = Array.new(2) { users[rand
* users.length] } => ['bob', 'alice'] 31
users = %w[alice bob carol] subset = Array.new(2) { users[rand
* users.length] } => ['bob', 'alice'] NO! 32
users = %w[alice bob carol] users.sample(2) => ['bob', 'carol'] 33
Array#sample(*args) 34
Array#sample(size, random: rng) 35
a = [1,2,3,4,5] a.sample => 3 36
a = [1,2,3,4,5] a.sample(3) => [3, 1, 5] 37
a = [1,2,3,4,5] a.sample(1) => [3] 38
a = [1,2,3,4,5] rng = Random.new(234) a.sample(random: rng) => 1
39
a = [1,2,3,4,5] rng = Random.new(234) a.sample(3, random: rng) =>
[1, 5, 2] 40
a = [1,2,3,4,5] rng = Random.new(234) a.shuffle(random: rng) => [3,
2, 5, 4, 1] 41
know your primitives (seriously) 42
generate a secure token from random values 43
token = '' 40.times do token << rand(0..255).to_s(16) end =>
'fe6d7e42dc62e6115...' 44
token = '' 40.times do token << rand(0..255).to_s(16) end =>
'fe6d7e42dc62e6115...' NO! 45
require 'securerandom' token = SecureRandom.hex(40) => '6011e8861f024cb75...' 46
require 'securerandom' token = SecureRandom.hex(40) => '6011e8861f024cb75...' => '8f90ea2187b50cb52...' =>
'cad2eb20a39939601...' => '272a822296de5b249...' => 'ad65839e646c27252...' 47
know your security (seriously) 48
hopefully you didn't learn anything 49