class Ipsumizer::AliasTable
copied in here and fixed because the gem was in a broken state
Public Class Methods
new(x_set, p_value)
click to toggle source
# File lib/ipsumizer.rb, line 69 def initialize(x_set, p_value) @p_primary = p_value.map(&:to_r) @x = x_set.clone.freeze @alias = Array.new(@x.length) parity = Rational(1, @x.length) group = @p_primary.each_index.group_by { |i| @p_primary[i] <=> parity } parity_set = group.fetch(0, []) parity_set.each { |i| @p_primary[i] = Rational(1) } deficit_set = group.fetch(-1, []) surplus_set = group.fetch(1, []) until deficit_set.empty? deficit = deficit_set.pop surplus = surplus_set.pop @p_primary[surplus] -= parity - @p_primary[deficit] @p_primary[deficit] /= parity @alias[deficit] = @x[surplus] if @p_primary[surplus] == parity @p_primary[surplus] = Rational(1) else (@p_primary[surplus] < parity ? deficit_set : surplus_set) << surplus end end end
Public Instance Methods
generate()
click to toggle source
# File lib/ipsumizer.rb, line 93 def generate column = rand(@x.length) rand <= @p_primary[column] ? @x[column] : @alias[column] end