12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #!/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})
- );
- }
|