Probabilistic choice

define TRIALS = 1e4
 
func prob_choice_picker(options) {
    var n = 0
    var a = []
    options.each { |k,v|
        n += v
        a << [n, k]
    }
    func {
        var r = 1.rand
        a.first{|e| r <= e[0] }[1]
    }
}
 
var ps = Hash(
   aleph  => 1/5,
   beth   => 1/6,
   gimel  => 1/7,
   daleth => 1/8,
   he     => 1/9,
   waw    => 1/10,
   zayin  => 1/11
)
 
ps{:heth} = (1 - ps.values.sum)
 
var picker = prob_choice_picker(ps)
var results = Hash()
 
TRIALS.times {
    results{picker():= 0 ++
}
 
say "Event   Occurred  Expected  Difference"
for k,v in (results.sort_by {|k| results{k} }.reverse) {
    printf("%-6s  %f  %f  %f\n",
        k, v/TRIALS, ps{k},
        abs(v/TRIALS - ps{k})
    )
}

Output:

Last updated

Was this helpful?