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