配列要素のランダム抽出でRuby1.8.7をチェック

配列で渡されたデータから指定した数をランダムで抽出するという処理が必要になったので、ちょっと考えてみた。

  • Ruby1.8.6 P114

Arrayを拡張することも考えたんだが、某所でPluginとして使いたいということだったので、適当なメソッドを作ってみる。

def get_random_data(data,max_size=nil)
  max_size = data.size if max_size > data.size or nil == max_size
  data_list = data.dup #sliceを使うのでコピー
  return (1..max_size).map {|i|data_list.slice!(rand(data_list.size))}
end

こんな感じ。引数で配列を渡して、そこから何個取り出すかを指定する。指定が無ければ全体をランダムにするし、大きすぎたら全体を返す。

とまあ、他愛のないメソッドなんだが、rubikitch(id:rubikitch)さんの「Ruby 1.8.7で使えるようになったRuby 1.9のメソッドたち」を拝見しているとRuby1.8.7で新しいメソッドが追加されてる(1.8.7は1.9からのバックポートが多いのは知っていたけど、かなり入ってるんですねえ)。

.shuffle と.shuffle!

これは便利だなあ。これがあれば並び替えて頭から好きな個数だけ返せばいいもんねえ。

data.shuffle[0..(max_size-1)]

こんな感じで今回の目的が達せられるんだろうか。便利になってるなあ。1.8.7での差分はもう一度読み直しておかないといけないな。