lib/weighted_shuffle/dealer.rb in weighted_shuffle-0.1.0 vs lib/weighted_shuffle/dealer.rb in weighted_shuffle-0.2.0
- old
+ new
@@ -1,16 +1,20 @@
require 'active_support/core_ext/enumerable'
module WeightedShuffle
class Dealer < Struct.new(:array)
- def weighted_shuffle
+ def weighted_shuffle(options = {})
+ factor = options.delete(:factor)
a = Marshal.load Marshal.dump(array)
- sum = a.sum { |k,v| v || 0.0 }
+ unless factor.nil?
+ a.map! { |k, v| [k, v**factor] }
+ end
+ sum = a.sum { |k, v| v || 0.0 }
b = []
a.length.times do
random = SecureRandom.random_number * sum
- a.each_with_index do |(k,v),j|
+ a.each_with_index do |(k, v), j|
if random <= v
b << a.delete_at(j).first
sum -= v
break
else