use strict; # Definition from HOP page 122 sub NEXTVAL { $_[0]->() } # HOP top of page 123, called "a bit of sugar" ??? #sub Iterator (&) { return $_[0] } #!!Important to make this work uncomment!!! #HOP page 156 sub make_rand { my $seed = shift || (time & 0x7ffff); print "Seed=$seed\n"; return Iterator { #print " << $seed\n"; $seed = (13 * $seed + 31011) & 0x7ffffff; #print " >> $seed\n"; return $seed; }; } # My test code my $rng = make_rand(); # a reference to an "Iterator" code different # from the one defined originally ?? my @bucket; my $i; my $t; #printf " ==%d\n",(2**31); # HOP pages 156,7 for $i (1..10000){ my $rndx = NEXTVAL ($rng); #print " $rndx "; $rndx %= 100; #print " $rndx\n"; $bucket[$rndx] ++; } # test code $t=0; for $i (0..99) { print "$bucket[$i]- "; $t+=$bucket[$i]; } printf "\nAvg= %6.2f\n", $t/100; __END__