Skip to content

Instantly share code, notes, and snippets.

@ck3g
Created March 8, 2016 10:28
Show Gist options
  • Save ck3g/2e32fac3284edad3ee9a to your computer and use it in GitHub Desktop.
Save ck3g/2e32fac3284edad3ee9a to your computer and use it in GitHub Desktop.
require 'ostruct'
alternatives = [
OpenStruct.new(name: "A1", weight: 1),
OpenStruct.new(name: "A2", weight: 1),
OpenStruct.new(name: "A3", weight: 1),
OpenStruct.new(name: "A4", weight: 1),
OpenStruct.new(name: "B1", weight: 1),
OpenStruct.new(name: "B2", weight: 1),
OpenStruct.new(name: "B3", weight: 1),
OpenStruct.new(name: "B4", weight: 1),
OpenStruct.new(name: "C1", weight: 1),
OpenStruct.new(name: "C2", weight: 1),
OpenStruct.new(name: "C3", weight: 1),
OpenStruct.new(name: "C4", weight: 1)
]
experiment = OpenStruct.new(alternatives: alternatives)
groups = {
"A1" => 0,
"A2" => 0,
"A3" => 0,
"A4" => 0,
"B1" => 0,
"B2" => 0,
"B3" => 0,
"B4" => 0,
"C1" => 0,
"C2" => 0,
"C3" => 0,
"C4" => 0
}
def choose_alternative(experiment)
weights = experiment.alternatives.map(&:weight)
total = weights.inject(:+)
point = rand * total
experiment.alternatives.zip(weights).each do |n, w|
return n if w >= point
point -= w
end
end
1_000_000.times do
chosen = choose_alternative(experiment)
groups[chosen.name] += 1
end
puts "*" * 80
%w(A B C).each do |group|
puts "#{group}: #{groups.select { |g, count| g[0] == group }.values.inject(:+)}"
end
# ------------------------------
# 1_000 times
#
# A: 336
# B: 364
# C: 300
# 10_000 times
# A: 3332
# B: 3371
# C: 3297
# 100_000 times
#
# A: 33486
# B: 33382
# C: 33132
# 1_000_000 times
#
# A: 333213
# B: 333712
# C: 333075
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment