For those interested in the simple Perl code I used yp generate the aboev results:
Code:
#!/usr/bin/perl
# monte_broke.pl
# by ganchrow AT SBForum DOT com
# output to STDERR is trial#<TAB>avg bankroll<TAB>std dev of that average
use strict;
use warnings;
use constant TRIALS => 10_000_000;
use constant NUM_BETS => 1_000;
use constant BET_SIZE => 0.05; # as fraction of starting bankroll
use constant ODDS_FOR => -160;
use constant ODDS_AGAINST => +140;
use constant VERBOSE => 0; # setting to TRUE prints all finishing bankrolls to STDOUT
my ($sum_bankroll, $sum_bankroll_sq,) = (0,0);
my $dec_odds = &us2dec(ODDS_FOR);
my $win_q = BET_SIZE*($dec_odds - 1);
my $loss_q = -1*BET_SIZE;
my $win_prob = &us2prob([ODDS_FOR,ODDS_AGAINST]);
for ( my $trial_num = 1 ; $trial_num <= TRIALS; $trial_num++) {
my $bankroll = 1;
for (my $bet_num = 1; ( ($bankroll > 0 ) && ( $bet_num <= NUM_BETS ) ); $bet_num++) {
$bankroll += (rand() < $win_prob ? $win_q : $loss_q);
}
print STDOUT "$bankroll\n" if VERBOSE;
$sum_bankroll += $bankroll;
$sum_bankroll_sq += $bankroll*$bankroll;
unless ($trial_num % 10_000) {
select((select(STDOUT), $| = 1)[0]) if VERBOSE; # flush standard output buffer
my $avg = $sum_bankroll/$trial_num;
my $stddev = ( sqrt( $sum_bankroll_sq + $bankroll*$bankroll ) / $trial_num );
print STDERR "$trial_num\t$avg\t$stddev\n";
select((select(STDERR), $| = 1)[0]); # flush standard error buffer
}
}
sub us2dec {
my $us = shift;
return (
$us >= 0 ? 1+$us/100 : 1-100/$us
);
}
sub us2prob {
# IN: takes pointer to array of us odds
# OUT: implied zero vig prob of 1st element
my $ar_p = shift;
my $first = &us2dec( shift @$ar_p );
my $sum = $first;
$sum += &us2dec( shift @$ar_p ) while @$ar_p;
return(1 - $first / ($sum || 1));
}