#!/usr/bin/ruby

#
## https://rosettacode.org/wiki/Probabilistic_choice
#

define TRIALS = 10;

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.new(
   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.new;

range(0, TRIALS).each {
    results{picker()} := 0 ++;
}

say "Event   Occurred  Expected  Difference";
results.sort_by {|k| results{k} }.reverse.each { |pair|
    var(k, v) = pair...;
    printf("%-6s  %f  %f  %f\n",
        k, v/TRIALS, ps{k},
        abs(v/TRIALS - ps{k})
    );
}