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)
とアホほど見通しよく書き直す事ができます。