trials:=1000000; Array probs[8]; {store the probabilities} [probs]:=[ 1/(i+4)]; probs[8]:=1-Sigma[probs[i,1]]; Func Round( a, b ) = (2*a+b)\(2*b).; {rounds a fraction with numerator a and denominator b} ; {to the nearest integer (positive fractions only)} Func Sel = {select a number from 1 to 8 according to the} r:=Rand|27720; {specified probabilities} if r < probs[1]*27720 then Return(1) fi; if r < Sigma[probs[i]]*27720 then Return(2) fi; if r < Sigma[probs[i]]*27720 then Return(3) fi; if r < Sigma[probs[i]]*27720 then Return(4) fi; if r < Sigma[probs[i]]*27720 then Return(5) fi; if r < Sigma[probs[i]]*27720 then Return(6) fi; if r < Sigma[probs[i]]*27720 then Return(7) fi; Return(8); .; Array label[10]; {strings are not Fermat's strong suit} Func Letter(n) = {assign a Hebrew letter to the numbers 1-8} [label]:='heth '; if n = 1 then [label]:='aleph ' fi; if n = 2 then [label]:='beth ' fi; if n = 3 then [label]:='gimel ' fi; if n = 4 then [label]:='daleth ' fi; if n = 5 then [label]:='he ' fi; if n = 6 then [label]:='waw ' fi; if n = 7 then [label]:='zayin ' fi; .; Array count[8]; {pick a bunch of random numbers} for i = 1 to trials do s:=Sel; count[s]:=count[s]+1; od; for i = 1 to 8 do {now display some diagnostics} Letter(i); ctp:=count[i]/trials-probs[i]; !([label:char, count[i]/trials,' differs from ',probs[i]); !(' by ',ctp, ' or about one part in ', Round(Denom(ctp),|Numer(ctp)|)); !!; od; !!('The various probabilities add up to ',Sigma[count[i]/trials]); {check if our trials add to 1}