Ruby、Enumerableから重み付きでランダムに要素を取り出すgemつくった
類似gemとしては
- ActiveRecord用のweighted_random
- {value => weight} 形式のHashを使う weighted_randomizer
というのがあったけど、当方のユースケースには合わなかったので自作した。
$ gem install weighted_sample
で入ります。
require 'weighted_sample' [1, 9, 90].weighted_sample_by {|x| x} # => 1(1%), 9(9%), 90(90%)
任意のEnumerableで使えるけど、内部的に2回eachしてるのでご留意ください。
重みに使えるのは、今のところ整数のみです(要望があればFloatにも対応するんじゃないかな or プルリクせよ)。