#!/usr/bin/perl ##### # program to calculate some craps odds with honest and crooked dice. # # At first I expected to look at the 1st, 2nd, 3rd, etc roll, # but then realized that if you get to the 2nd roll, the odds # are determined by the ratio of p(7)/p(point), since 7 loses and point wins; # all that matters is which comes up first. So winning or losing from # the 2nd roll on is simply the probability of getting to a specific point # times win/lose probabilities with that ratio. # # With the crooked dice we've been playing around with, # which are more likely to come up 1 or 6, you actually # have a smaller chance at winning at craps, even though # your odds of winning on the first roll are higher. # # - Jim Mahoney, Feb 6 2006 ###### use strict; use warnings; use Data::Dumper; my ($A, $B); # 1 die probabilities my @p; # 2 dice probabilities my @r; # after n rolls of 2 dice my @points = (4,5,6,8,9,10); # numbers that continue on first roll my ($win, $lose); # Usage: e.g. set_A(1/6); sub set_A { $A = shift; # = p(1) = p(6) ; one die $B = (1.0-2*$A)/4.; # = p(2) = p(3) = p(4) = p(5); one die $p[0] = $p[1] = 0; $p[2] = $p[12] = $A**2; $p[3] = $p[11] = 2 * $A * $B; $p[4] = $p[10] = 2 * $A * $B + 1 * $B**2; $p[5] = $p[9] = 2 * $A * $B + 2 * $B**2; $p[6] = $p[8] = 2 * $A * $B + 3 * $B**2; $p[7] = 2 * $A**2 + 4 * $B**2; $r[1] = {}; $win = $r[1]->{win} = $p[7] + $p[11]; $lose = $r[1]->{lose} = $p[2] + $p[3] + $p[12]; $r[1]->{continue} = $p[4] + $p[5] + $p[6] + $p[8] + $p[9] + $p[10]; for my $point (@points){ $r[1]->{$point} = $p[$point]; $r[1]->{$point . "_odds"} = $p[$point]/$p[7]; $win += $p[$point] * $p[$point]/($p[$point] + $p[7]); $lose += $p[$point] * $p[7]/($p[$point] + $p[7]); } print " p(1)=p(6)= " . round($A) . "\n"; print " p(2)=p(3)=p(4)=p(5)= " . round($B) . "\n"; print " prob of 1st roll win = " . round($r[1]->{win}) . "\n"; print " prob of 1st roll lose = " . round($r[1]->{lose}) . "\n"; print " prob of 1st roll continue = " . round($r[1]->{continue}) . "\n"; print " prob of overall win = " . round($win) . "\n"; print " prob of overall lose = " . round($lose) . " \n"; print "\n"; } sub round { my $x = shift; return sprintf("%4.3g",$x); } my $A_honest = 1./6.; my $A_loaded = 0.203; # best guess from 2006 toolbox & 2005 data my $sigma = 0.013; # weighted average of 2006 & 2005; N = 1300 print " -- honest dice -- \n"; set_A( $A_honest ); print " -- best guess for loaded dice -- \n"; set_A( $A_loaded ); print " -- loaded + 2 sigma -- \n"; set_A( $A_loaded + 2*$sigma ); print " -- loaded - 2 sigma -- \n"; set_A( $A_loaded - 2*$sigma ); __END__ mahoney@cs dice_and_statistics$ ./craps.pl -- honest dice -- p(1)=p(6)= 0.167 p(2)=p(3)=p(4)=p(5)= 0.167 prob of 1st roll win = 0.222 prob of 1st roll lose = 0.111 prob of 1st roll continue = 0.667 prob of overall win = 0.493 prob of overall lose = 0.507 -- best guess for loaded dice -- p(1)=p(6)= 0.203 p(2)=p(3)=p(4)=p(5)= 0.148 prob of 1st roll win = 0.231 prob of 1st roll lose = 0.143 prob of 1st roll continue = 0.626 prob of overall win = 0.471 prob of overall lose = 0.529 -- loaded + 2 sigma -- p(1)=p(6)= 0.229 p(2)=p(3)=p(4)=p(5)= 0.136 prob of 1st roll win = 0.24 prob of 1st roll lose = 0.167 prob of 1st roll continue = 0.593 prob of overall win = 0.454 prob of overall lose = 0.546 -- loaded - 2 sigma -- p(1)=p(6)= 0.177 p(2)=p(3)=p(4)=p(5)= 0.161 prob of 1st roll win = 0.224 prob of 1st roll lose = 0.12 prob of 1st roll continue = 0.656 prob of overall win = 0.487 prob of overall lose = 0.513
syntax highlighted by Perl::Tidy 20060719