#!/usr/local/bin/perl -w # reads a (difference in potential) and n (game to n) from command line # and returns the prob that team 1 would win # # = sum_x=0..n-1 p^x q^n ( x+n-1 choose x ) # # x being the loser's score $a=-1; $n=-1; eval "\$$1=\$2" while @ARGV && $ARGV[0]=~ /^(\w+)=(.*)/ && shift; if ( $a < 0 || $n < 1 ) { print STDERR "You must supply a and n\n" ; &print_usage (); exit(0); } sub print_usage { print STDERR " win.p a=1 n=15\n" ; } $p = 1.0 / ( 1.0 + exp ( - $a ) ) ; $q = 1.0 / ( 1.0 + exp ( $a ) ) ; if ( $p > $q ) { $p = 1.0 - $q ; } else { $q = 1.0 - $p ; } printf "p = %9.3g, q = %9.3g\n" , $p , $q ; $pwin = 0.0 ; $plose = 0.0 ; $choose = 1 ; $pxqn = $q ** $n ; # prob of an n - nil loss $qxpn = $p ** $n ; # prob of an n - nil win for ( $x = 0 ; $x <= $n-1 ; ) { $pwintox = $qxpn * $choose ; $pwin += $pwintox ; $plosetox = $pxqn * $choose ; $plose += $plosetox ; printf "(win %2d:%2d) = %9.3g, [%9.3g] (lose %2d:%2d) = %9.3g [%9.3g]\n" , $n , $x , $pwintox , $pwin , $x, $n , $plosetox , $plose ; $pxqn *= ($p) ; $qxpn *= ($q); $x ++ ; $choose *= ($x + $n - 1.0 ) / $x ; } printf "prob(win) = %9.3g, prob(lose) = %9.3g\n" , $pwin , $plose ; #