40 lines
861 B
Plaintext
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
|