RosettaCodeData/Task/Average-loop-length/Unicon/average-loop-length.unicon

40 lines
861 B
Plaintext

link printf, factors
$define MAX_N 20
$define TIMES 1000000
$define RAND_MAX 2147483647
procedure expected(n)
local sum := 0
every i := 1 to n do
sum +:= factorial(n) / (n ^ i) / factorial(n - i)
return sum
end
procedure test(n, times)
local i, count := 0, x, bits
every i := 0 to times-1 do {
x := 1
bits := 0
while iand(bits, x)=0 do {
count +:= 1
bits := ior(bits, x)
x := ishift(1 , ?n-1)
}
}
return count
end
procedure main(void)
local n, cnt, avg, theory, diff
write(" n\tavg\texp.\tdiff\n", repl("-",29))
every n := 1 to MAX_N do {
cnt := test(n, TIMES)
avg := real(cnt) / TIMES
theory := expected(n)
diff := (avg / theory - 1) * 100
printf("%2d %8.4r %8.4r %6.3r%%\n", n, avg, theory, diff)
}
return 0
end