Enumerable#shuffle

by tanabe on July 23, 2006

Enumerable#shuffle かー。

てことで書いてみた。

# random_index.rb
class RandomIndex

  def initialize(size)
    @indexes = Array.new(size) { |i| i }
  end

  def next
    @indexes.delete_at(rand(@indexes.size))
  end

end

# enumerable_shuffle_method.rb
module Enumerable

  def shuffle(seed = nil)

    srand(seed) if seed

    require 'random_index'
    entries = self.entries # for chache
    indexes = RandomIndex.new(entries.size)

    shuffled_entries = []

    while index = indexes.next
      shuffled_entries << entries[index]
    end

    shuffled_entries

  end

end

class Array 
  def shuffle!
    self.replace self.shuffle
  end
end

というような話でいいんだろうか?

この実装だとパフォーマンスがわりと厳しいので、実際は要素の数が1万個くらいまでが実用できる限度だと思う。

追記:Enumerable#sort や Enumerable#collect と同様に結果は Array クラスで返す。



この記事へのトラックバック
なんでrubyには - ’hceT’.sub(/¥Z/,’bus’).reverse Enumerable#shuffle - 満足せる豚。眠たげなポチ。 確かにあると便利ですよねぇ。僕も勝手に定義して使ってます。うちのはこんな感じです。 module Enumerable def shuffle() return self.to_a().dup().shuffle!() en
[ruby] Enumerable#shuffle【daily gimite】at July 25, 2006 11:43