Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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)

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