Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Array#sampleをつかって配列からランダムに要素を引っ張り出す

Array#sampleは、配列からランダムに要素を引っ張り出すメソッドです。
実は以前の記事でちょっと触れたのですが、理解が深まったのでメモ。

用途

何もつけなければ、一個の要素をランダムに抽出します。

(1..99).to_a.sample
#=> 36

(1..99).to_a.sample
#=> 20

また、乱数シードを固定し一意な結果にする事も可能です

 (1..99).to_a.sample(random: Random.new(1234))
#=> 48

(1..99).to_a.sample(random: Random.new(1234))
#=> 48

(1..99).to_a.sample(random: Random.new(1234))
#=> 48

引数に数値を与えるで、任意の個数引っぱり出す事もできます。

(1..99).to_a.sample(4)
#=> [92, 56, 84, 46]

(1..99).to_a.sample(4)
#=> [17, 35, 51, 89]

実際の運用

「Si Vis Pacem, Para Bellum」(平和を望むならば戦いに備えよ)という語句から、2ワードを切り出す…なんて課題があったとします。
いくらでも筋の悪い書き方はできそうです。
例えば…

ary  = "Si Vis Pacem, Para Bellum".scan(/\w+/)
size = ary.size

2.times { (result ||= []).push(ary[rand(size)]) }

p result

とか。

ここで、Array#sampleを知っていると

p "Si Vis Pacem, Para Bellum".scan(/\w+/).sample(2)

とアホほど見通しよく書き直す事ができます。