probabilistic_choice.sf 841 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Probabilistic_choice
  4. #
  5. define TRIALS = 10;
  6. func prob_choice_picker(options) {
  7. var n = 0;
  8. var a = [];
  9. options.each { |k,v|
  10. n += v;
  11. a << [n, k];
  12. }
  13. func {
  14. var r = 1.rand;
  15. a.first{|e| r <= e[0] }[1];
  16. }
  17. }
  18. var ps = Hash.new(
  19. aleph => 1/5,
  20. beth => 1/6,
  21. gimel => 1/7,
  22. daleth => 1/8,
  23. he => 1/9,
  24. waw => 1/10,
  25. zayin => 1/11
  26. );
  27. ps{:heth} = (1 - ps.values.sum);
  28. var picker = prob_choice_picker(ps);
  29. var results = Hash.new;
  30. range(0, TRIALS).each {
  31. results{picker()} := 0 ++;
  32. }
  33. say "Event Occurred Expected Difference";
  34. results.sort_by {|k| results{k} }.reverse.each { |pair|
  35. var(k, v) = pair...;
  36. printf("%-6s %f %f %f\n",
  37. k, v/TRIALS, ps{k},
  38. abs(v/TRIALS - ps{k})
  39. );
  40. }