From: Shota Fukumori Date: 2010-12-10T22:45:58+09:00 Subject: [ruby-dev:42739] [Ruby 1.9-Feature#4147] Array#sample で重みを指定したい チケット #4147 が更新されました。 (by Shota Fukumori) Rubyで実装してみました。あまりコストとか速度は気にしていないので速度は気にせず。 class Array def sample(n=1) if block_given? self.size.times.map do |i| Array.new(yield(self[i]), self[i]) end.flatten.sample(n) else n == 1 ? self[rand(self.size)] : Array.new(n){ self[rand(self.size)] } end end end # -- テスト def a [1,2,3].sample { |v| v*100 } end def b [1,2,3].sample { |v| v*100 } end ary = 100.times.map{a} bry = 100.times.map{b} result_a = {} ary.each do |i| result_a[i] ||= 0 result_a[i] += 1 end result_b = {} bry.each do |i| result_b[i] ||= 0 result_b[i] += 1 end # aは i*10の重みあり。 bは重みなし。 {i => 出現回数} p result_a #=> {2=>31, 3=>56, 1=>13} p result_b #=> {2=>37, 3=>45, 1=>18} # -- sora_h ---------------------------------------- http://redmine.ruby-lang.org/issues/show/4147 ---------------------------------------- http://redmine.ruby-lang.org