#!/usr/bin/perl use strict; my ($MINDAY, $ITERATES, $CLOSE) = qw(480 1024 .1); my ($MYNUM, $MYLEN, $TARGET) = qw(4 5 1); my ($yonum, $yolen) = ($MYNUM, $MYLEN); my ($score); while (abs($TARGET - $score) > $CLOSE) { if ($score < $TARGET) { rand() < .5 ? $yonum++ : $yolen++; } else { rand() < .5 ? $yonum-- : $yolen--; } $score = monte($ITERATES, $MYNUM, $MYLEN, $yonum, $yolen); print "$yonum breaks of $yolen minutes = see ya $score times\n"; } #----------------------------------------------------------- sub monte { my ($iter, $mynum, $mylen, $yonum, $yolen) = @_; my ($i, $tot); for ($i = 0; $i < $iter; $i++) { $tot += iterate($mynum, $mylen, $yonum, $yolen); } return $tot / $iter; } #----------------------------------------------------------- sub iterate { my ($mynum, $mylen, $yonum, $yolen) = @_; my ($i, $j, $r, @myday, @yoday, %seen); $i = 0; while ($i < $mynum) { $r = rand($MINDAY - $mylen); if ($myday[$r] eq '' && $myday[$r+$mylen] eq '') { $i++; for ($j = 0; $j < $mylen; $j++) { $myday[$r+$j] = $i; } } } $i = 0; while ($i < $yonum) { $r = rand($MINDAY - $yolen); if ($yoday[$r] eq '' && $yoday[$r+$yolen] eq '') { $i++; for ($j = 0; $j < $yolen; $j++) { $yoday[$r+$j] = $i; if ($myday[$r+$j] > 0) { $seen{$myday[$r+$j]}++; } } } } return (keys(%seen)); }