Slide 1

Slide 1 text

Rando # Ruby v2.1.1 Random.srand 123 1

Slide 2

Slide 2 text

four random things 2

Slide 3

Slide 3 text

pick a random number between 100 and 200 3

Slide 4

Slide 4 text

(rand * 100 + 100).to_i => 169 4

Slide 5

Slide 5 text

(rand * 100 + 100).to_i => 169 NO! 5

Slide 6

Slide 6 text

rand(100..200) => 166 6

Slide 7

Slide 7 text

rand(*args) 7

Slide 8

Slide 8 text

how many kinds of random does Ruby have? 8

Slide 9

Slide 9 text

ObjectSpace .each_object .select { |obj| obj.respond_to?(:rand) } 9

Slide 10

Slide 10 text

Kernel Random # 10

Slide 11

Slide 11 text

Kernel Random # Random::DEFAULT => # 11

Slide 12

Slide 12 text

Kernel Random # 12

Slide 13

Slide 13 text

rand == Kernel.rand Random.rand == Random::DEFAULT.rand Kernel.rand != Random.rand 13

Slide 14

Slide 14 text

Kernel.rand => 0.6964691855978616 Random.rand => 0.6964691855978616 14

Slide 15

Slide 15 text

Kernel.rand(100) => 66 Random.rand(100) => 66 15

Slide 16

Slide 16 text

Kernel.rand(0..100) => 66 Random.rand(0..100) => 66 16

Slide 17

Slide 17 text

Kernel.rand(100.0) => 66 Random.rand(100.0) => 69.64691855978616 17

Slide 18

Slide 18 text

Kernel.rand(-100.0) => 66 Random.rand(-100.0) => ArgumentError 18

Slide 19

Slide 19 text

know your rand 19

Slide 20

Slide 20 text

generate a list of random numbers 20

Slide 21

Slide 21 text

(0..20).map { rand } => [0.696469, 0.286139, ...] 21

Slide 22

Slide 22 text

(0..20).map { rand } => [0.696469, 0.286139, ...] NO! 22

Slide 23

Slide 23 text

Array.new(20) { rand } => [0.696469, 0.286139, ...] 23

Slide 24

Slide 24 text

Array.new(*args) 24

Slide 25

Slide 25 text

Array.new(size, obj, &generator) 25

Slide 26

Slide 26 text

Array.new(3) => [nil, nil, nil] 26

Slide 27

Slide 27 text

Array.new(3, 0) => [0, 0, 0] 27

Slide 28

Slide 28 text

Array.new(3) { |n| n } => [0, 1, 2] 28

Slide 29

Slide 29 text

know your primitives 29

Slide 30

Slide 30 text

pick a random subset of elements from an array 30

Slide 31

Slide 31 text

users = %w[alice bob carol] subset = Array.new(2) { users[rand * users.length] } => ['bob', 'alice'] 31

Slide 32

Slide 32 text

users = %w[alice bob carol] subset = Array.new(2) { users[rand * users.length] } => ['bob', 'alice'] NO! 32

Slide 33

Slide 33 text

users = %w[alice bob carol] users.sample(2) => ['bob', 'carol'] 33

Slide 34

Slide 34 text

Array#sample(*args) 34

Slide 35

Slide 35 text

Array#sample(size, random: rng) 35

Slide 36

Slide 36 text

a = [1,2,3,4,5] a.sample => 3 36

Slide 37

Slide 37 text

a = [1,2,3,4,5] a.sample(3) => [3, 1, 5] 37

Slide 38

Slide 38 text

a = [1,2,3,4,5] a.sample(1) => [3] 38

Slide 39

Slide 39 text

a = [1,2,3,4,5] rng = Random.new(234) a.sample(random: rng) => 1 39

Slide 40

Slide 40 text

a = [1,2,3,4,5] rng = Random.new(234) a.sample(3, random: rng) => [1, 5, 2] 40

Slide 41

Slide 41 text

a = [1,2,3,4,5] rng = Random.new(234) a.shuffle(random: rng) => [3, 2, 5, 4, 1] 41

Slide 42

Slide 42 text

know your primitives (seriously) 42

Slide 43

Slide 43 text

generate a secure token from random values 43

Slide 44

Slide 44 text

token = '' 40.times do token << rand(0..255).to_s(16) end => 'fe6d7e42dc62e6115...' 44

Slide 45

Slide 45 text

token = '' 40.times do token << rand(0..255).to_s(16) end => 'fe6d7e42dc62e6115...' NO! 45

Slide 46

Slide 46 text

require 'securerandom' token = SecureRandom.hex(40) => '6011e8861f024cb75...' 46

Slide 47

Slide 47 text

require 'securerandom' token = SecureRandom.hex(40) => '6011e8861f024cb75...' => '8f90ea2187b50cb52...' => 'cad2eb20a39939601...' => '272a822296de5b249...' => 'ad65839e646c27252...' 47

Slide 48

Slide 48 text

know your security (seriously) 48

Slide 49

Slide 49 text

hopefully you didn't learn anything 49