class RailsDataExplorer::Statistics::RngCategory

Responsibilities:

* Provide random categorical data. Useful for testing and demo data.

Public Class Methods

new(categories, category_probabilities = nil, rng = lambda { Kernel.rand }) click to toggle source

@param categories [Array<Object>] the pool of available categories. @param category_probabilities [Array, optional] probability of each category. @param rng [Proc, optional] lambda to generate random numbers which will

be mapped to categories.
# File lib/rails_data_explorer/statistics/rng_category.rb, line 14
def initialize(categories, category_probabilities = nil, rng = lambda { Kernel.rand })
  @categories, @category_probabilities, @rng = categories, category_probabilities, rng
  @category_probabilities ||= @categories.map { |e| @rng.call }
  @category_probabilities = normalize_category_probabilities
  @category_order = compute_category_order
end

Public Instance Methods

rand() click to toggle source

Returns a random category

# File lib/rails_data_explorer/statistics/rng_category.rb, line 22
def rand
  r_v = @rng.call
  rnd = @category_order.detect { |e|
    e[:threshold] >= r_v
  }
  rnd[:category]
end

Protected Instance Methods

compute_category_order() click to toggle source
# File lib/rails_data_explorer/statistics/rng_category.rb, line 37
def compute_category_order
  category_order = []
  running_sum = 0
  @categories.each_with_index { |e, idx|
    running_sum += @category_probabilities[idx]
    category_order << { category: e, threshold: running_sum }
  }
  category_order
end
normalize_category_probabilities() click to toggle source
# File lib/rails_data_explorer/statistics/rng_category.rb, line 32
def normalize_category_probabilities
  total = @category_probabilities.inject(0) { |m,e| m += e }
  @category_probabilities.map { |e| e / total.to_f }
end