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; } #### 0 0.1001 (0.8999) 1 0.2670 (0.6329) 2 0.3115 (0.3215) 3 0.2076 (0.1138) 4 0.0865 (0.0273) 5 0.0231 (0.0042) 6 0.0038 (0.0004) 7 0.0004 (0.0000) 8 0.0000 (0.0000) Expected: 2