my $n = shift || 8; my $p = shift || .25; for ($i=0; $i<=$n; ++$i) { my $prob = choose($n,$i) * ($p**$i) * ((1-$p)**($n-$i)); $x += $i * $prob; $tp += $prob; printf "%2d %.4f\t(%.4f)\n", $i, $prob, 1-$tp; } print "Expected: $x\n"; sub choose { my ($n, $r) = @_; return 0 if $n < 0 || $r < 0 || $r > $n; return 1 if $r == 0 || $r == $n; return choose($n-1,$r-1) * $n / $r; }