Sha256: 938fff1cd2bbcdab9ef5b5a8d74815183f73e8aaaa656be1984fd2083c7730cc

Contents?: true

Size: 630 Bytes

Versions: 1

Compression:

Stored size: 630 Bytes

Contents

require 'rubygems'
require 'bsearch'

class Array

  def get_rand(weights)
    GuidedRandomness.new(self, weights).sample.first
  end
  
end

class GuidedRandomness < Struct.new(:source, :weights)

  def initialize(*params)
    super
    raise ArgumentError, "Wrong number of array elements!" if weights.size != source.size || weights.size == 0
    @sums = weights.inject([]){|ary, weight| ary << ((ary.last || 0) + weight)}
    @total = @sums.last
  end

  def sample(size = 1)
    size.times.map do
      rand = Kernel.rand*@total
      index = @sums.bsearch_lower_boundary{|x| x <=> rand}
      source[index]
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
guided_randomness-0.1.4 lib/guided_randomness.rb