class RandomVariateGenerator::Random
Public Class Methods
bernoulli(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 42 def self.bernoulli(params) (rand() < params[:probability_of_success])? 1 : 0 end
binomial(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 46 def self.binomial(params) counter = 0 params[:number_of_trials].times{ counter += bernoulli(:probability_of_success => params[:probability_of_success]) } counter end
empirical(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 79 def self.empirical(params) probs = params[:probabilities] cda = [] acum = 0 probs.each{|x| acum += x cda << acum } cda << 1 cda.each{|x| x=1 if x > 1} u = rand index = 0 index += 1 while u > cda[index] index end
exponential(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 5 def self.exponential(params) u = rand() u = rand() while u <= 1e-7 -Math.log(u)/params[:lambda] end
geometric(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 63 def self.geometric(params) negative_binomial(:number_of_success => 1, :probability_of_success => params[:probability_of_success]) end
negative_binomial(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 54 def self.negative_binomial(params) counter = 0 success_counter = 0 while success_counter < params[:number_of_success] counter += 1 success_counter += bernoulli(:probability_of_success => params[:probability_of_success]) end counter end
normal(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 11 def self.normal(params) x2pi = rand() * Math::PI g2rad = Math.sqrt(-2.0 * Math.log(1.0 - rand())) z = Math.cos(x2pi) * g2rad params[:mu] + z*params[:sigma] end
poisson(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 68 def self.poisson(params) cummulative_time = 0 cummulative_time += exponential(:lambda => params[:lambda]) counter = 0 while cummulative_time <= 1.0 counter += 1 cummulative_time += exponential(:lambda => params[:lambda]) end counter end
triangular(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 22 def self.triangular(params) params[:min] *= 1.0 params[:mode] *= 1.0 params[:max] *= 1.0 u = rand() c = 0.5 (params[:mode] - params[:min]) / (params[:max] - params[:min]) if params[:mode] if u > c u = 1.0 - u c = 1.0 - c params[:min], params[:max] = params[:max], params[:min] end params[:min] + (params[:max] - params[:min]) * (u * c) ** 0.5 end
uniform(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 18 def self.uniform(params) params[:min] + (params[:max]-params[:min]) * rand() end
uniform_discrete(params)
click to toggle source
# File lib/random_variate_generator/random.rb, line 37 def self.uniform_discrete(params) uniform(:min => params[:min], :max => (params[:max]+1)).to_i end