http://www.perlmonks.org?node_id=204415


in reply to Re: check my logic & a random number issue
in thread check my logic & a random number issue

Greetings!!

PPS: FWIW in the interests of not installing more stuff, my roll function came out to be:

sub rolldice() { my $roll = int(rand(12)) + 1; return $roll; }
After reading your node, jarich, I began wondering how different Math::Random, int(rand(6)) and int(rand(12)) might be... I noted your suggested rolldice() subroutine quoted above. To appropriately spread the roll result to mimic a table craps game, there should be a curve peaking at seven. I decided to slap together a quick test...

#!c:\perl\bin\perl.exe use strict; use warnings; use diagnostics; use Math::Random; my $num_rolls = 10000; my @rollhashes; for (my $i=0; $i<4; $i++) { $rollhashes[$i] = { 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 10 => 0, 11 => 0, 12 => 0 }; } for (1 .. $num_rolls) { my $m1 = random_uniform_integer(1,1,6); my $m2 = random_uniform_integer(1,1,6); my $math = $m1 + $m2; $rollhashes[2]{$math}++; my $m0 = random_uniform_integer(2,1,12); $rollhashes[0]{$m0}++; my $r1 = (int(rand(6) + 1)); my $r2 = (int(rand(6) + 1)); my $rand = $r1 + $r2; $rollhashes[3]{$rand}++; my $r0 = (int(rand(12) + 2)); $rollhashes[1]{$r0}++; } print "\nUSING TWO DICE:\n"; print "\nMath::Random\t\tint(rand)\n"; for (my $i = 2; $i <= 12; $i++) { my $n = sprintf("%02d",$i); print "$n = $rollhashes[2]{$i}\t\t$n = $rollhashes[3]{$i}\n"; } print "\nUSING ONE DIE:\n"; print "\nMath::Random\t\tint(rand)\n"; for (my $i = 2; $i <= 12; $i++) { my $n = sprintf("%02d",$i); print "$n = $rollhashes[0]{$i}\t\t$n = $rollhashes[1]{$i}\n"; }
And here is the output:

USING TWO DICE: Math::Random int(rand) 02 = 271 02 = 270 03 = 533 03 = 606 04 = 876 04 = 849 05 = 1129 05 = 1172 06 = 1364 06 = 1362 07 = 1640 07 = 1632 08 = 1390 08 = 1402 09 = 1101 09 = 1079 10 = 876 10 = 838 11 = 540 11 = 535 12 = 280 12 = 255 USING ONE DIE: Math::Random int(rand) 02 = 862 02 = 852 03 = 853 03 = 835 04 = 795 04 = 865 05 = 849 05 = 876 06 = 817 06 = 772 07 = 801 07 = 836 08 = 822 08 = 801 09 = 809 09 = 814 10 = 856 10 = 821 11 = 891 11 = 841 12 = 823 12 = 848
So, using one die rather than two has a tremendous impact on the spread of the numbers! Additionally, I noted that the differences between using Math::Random and int(rand(6)) were fairly slight. After running the above code over numerous tests, I found them to be quite comparable. In the interest of not installing more than is necessary, I would go with the int(rand(6)) rather than slurping in the Math::Random goodies.

Craps is my favorite Vegas game... I find it to be the most fun and exciting of all the games I've tried. (Probably more fun than it should be!)

-Daruma

Update: formatting changes and fixed reference to jarich's rand(12) usage... Thanks, jarich!!
Update2:Reworked my unnecessarily long code with a few loops...