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