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