Keep It Simple, Stupid PerlMonks

### Re^5: Monte Carlo - Coin Toss

by roboticus (Chancellor)
 on Mar 13, 2011 at 05:45 UTC ( #892904=note: print w/replies, xml ) Need Help??

in reply to Re^4: Monte Carlo - Coin Toss
in thread Monte Carlo - Coin Toss

Sweet! So of course I had to take another look:

sub pascal_tri_row {
my $r = shift; return () if$r < 0;

my @row = (1) x ($r + 1); for my$i (1 .. $r - 1) {$row[$_] +=$row[$_ - 1] for reverse 1 ..$i;
}
return @row;
}

sub robo_2 {
my $row = shift; my @cols = (1); ++$row;
$cols[$_] = $cols[$_-1] * ($row-$_)/$_ for 1 ..$row-1;
return @cols;
}

sub triangle {
my $numTosses = shift; my @triangle = (0, 1, 0); for (1 ..$numTosses) {
my @newTriangle=(0);
push @newTriangle, $triangle[$_]+$triangle[$_+1] for 0 .. $#tr +iangle-1; push @newTriangle, 0; @triangle = @newTriangle; } return @triangle[1..$#triangle-1];
}

use Benchmark qw(cmpthese);

print "robo_1: ", join(" ",triangle(8)), "\n";
print "repel1: ", join(" ",pascal_tri_row(8)), "\n";
print "robo_2: ", join(" ",robo_2(8)), "\n";

cmpthese -1, {
robo_tri  => sub { triangle(32) },
repel_tri => sub { pascal_tri_row(32) },
robo_2    => sub { robo_2(32) },
};
[download]

First I put in a trace so I could be sure I wasn't generating useless values. Next, I couldn't bear the zeroes you had to add to your function to match my original return value. They were just sentinel values to simplify the calculation, anyway. So I fixed the original to return only the values of interest. Finally, I had to squeeze a little more speed out of it:

\$ perl 892898.pl
robo_1: 1 8 28 56 70 56 28 8 1
repel1: 1 8 28 56 70 56 28 8 1
robo_2: 1 8 28 56 70 56 28 8 1
Rate  robo_tri repel_tri    robo_2
robo_tri   2196/s        --      -42%      -93%
repel_tri  3775/s       72%        --      -88%
robo_2    31946/s     1355%      746%        --
[download]

You should've read a bit further down in the wikipedia article you linked. It had a much better algorithm for calculating the coefficients of any row. It saved a nested loop.

;^)

...roboticus

When your only tool is a hammer, all problems look like your thumb.

Replies are listed 'Best First'.
Re^6: Monte Carlo - Coin Toss
by repellent (Priest) on Mar 13, 2011 at 06:01 UTC
Wonderful! That is the one. Thanks, roboticus.

Create A New User
Node Status?
node history
Node Type: note [id://892904]
help
Chatterbox?
 [Corion]: Option a) would mean launching cmd.exe /k c:\path\to\ batchfile- launching-perl- script.cmd. Option b) would be to add pause as the last line of said batch file. [LanX]: First day after holidays ... and already stressed by the fact that colleagues changed stuff without communication ... apparently I'm the only one trying to fight entropy [Corion]: LanX: The command is always in the history if you typed it in before. If you didn't type the command into the command line, it will not be there. I think there is doskey which can stuff command lines into the history LanX damns the cult of CB ;-) LanX WTF WTF WTF [LanX]: please forget my last 3 posts [LanX]: Yeah option a doesn't go into history [LanX]: probably I need to teach the app to restart after C-c Kill [Corion]: LanX: Maybe have an infinite-loop cmd file? Much easier than trying to manage that from within Perl IMO [Corion]: Alternatively, relaunch the application from cron (or a Windows cron) every minute

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (12)
As of 2017-03-27 15:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Should Pluto Get Its Planethood Back?

Results (320 votes). Check out past polls.