11package PGrandom ;
22
33use strict;
4+ use warnings;
45
56my $multiplier = 69069;
67
@@ -9,69 +10,63 @@ my $translate = 1;
910my $modulus = 2**32;
1011
1112sub new {
12- my $class = shift ;
13- my $seed = shift ;
13+ my ($class , $seed ) = @_ ;
1414
15- $seed = 1 unless defined ( $seed ) ;
15+ $seed // = 1;
1616 my $original_seed = $seed ;
1717 $seed = mod($multiplier * $seed + $translate , $modulus );
18- my $self = {
19- ' seed' => $seed ,
20- ' original_seed' => $original_seed , # this and the next value are largely for debugging
21- ' number_of_calls' => 1 # there is always one call to set the seed.
22- };
2318
24- bless $self , $class ;
25-
26- return $self ;
19+ return bless {
20+ seed => $seed ,
21+ original_seed => $original_seed , # This and the next value are largely for debugging.
22+ number_of_calls => 1 # There is always one call to set the seed.
23+ }, $class ;
2724}
2825
29- sub mod { # for some reason perl's % doesn't seem to work for large numbers?
30- my $a = shift ;
31- my $b = shift ;
32- $a - int ($a / $b ) * $b ;
26+ # Perl's % modulus operator does not work for large numbers. So use mod here instead. Although, does this ever actually
27+ # need to handle numbers greater than 2^63 - 1 which is where the % operator fails? I think this dates back to the days
28+ # of 32 bit integers being used.
29+ sub mod {
30+ my ($m , $n ) = @_ ;
31+ return $m - int ($m / $n ) * $n ;
3332}
3433
3534sub random {
36- my $self = shift ;
37- my $begin = shift ;
38- my $end = shift ;
39- my $incr = shift ;
40- my $out ;
41- $self -> {' number_of_calls' }++;
42- $incr = 1 unless defined ($incr );
35+ my ($self , $begin , $end , $incr ) = @_ ;
36+ ++$self -> {number_of_calls };
37+ $incr //= 1;
4338 my $seed = $self -> {' seed' };
4439 my $new_seed = mod($multiplier * $seed + $translate , $modulus );
45- $self -> {' seed' } = $new_seed ;
40+ $self -> {seed } = $new_seed ;
4641
4742 unless ($incr <= 0) {
48- $out = $begin + $incr * int (($new_seed / ($modulus )) * (int (($end - $begin ) / $incr ) + 1));
49- } else { # if $incr is less than zero return "continuous" distribution
50- $out = $begin + ($end - $begin ) * $new_seed / $modulus ;
43+ # If $incr is less than zero, then return a "continuous" distribution.
44+ return $begin + $incr * int (($new_seed / ($modulus )) * (int (($end - $begin ) / $incr ) + 1));
45+ } else {
46+ return $begin + ($end - $begin ) * $new_seed / $modulus ;
5147 }
52- $out ;
53-
5448}
5549
5650sub rand {
57- my $self = shift ;
58- my $end = shift ;
59- $end = 1 unless defined ($end );
60- $self -> random(0, $end , 0);
51+ my ($self , $end ) = @_ ;
52+ $end //= 1;
53+ return $self -> random(0, $end , 0);
6154}
6255
6356sub srand {
64- my $self = shift ;
65- my $new_seed = shift ;
66- $self -> { ' original_seed ' } = $ new_seed;
67- $new_seed = mod( $multiplier * $new_seed + $translate , $modulus ); # reset the seed
68- $self -> {' number_of_calls ' } = 1 ;
69- $self -> { ' seed ' } = $new_seed ;
57+ my ( $self , $new_seed ) = @_ ;
58+ $self -> { original_seed } = $new_seed ;
59+ $new_seed = mod( $multiplier * $ new_seed + $translate , $modulus ); # reset the seed
60+ $self -> { number_of_calls } = 1;
61+ $self -> {seed } = $new_seed ;
62+ return ;
7063}
7164
72- sub seed { # synonym for srand
73- my $self = shift ;
74- $self -> srand (@_ );
65+ # This is a synonym for srand.
66+ sub seed {
67+ my ($self , $new_seed ) = @_ ;
68+ $self -> srand ($new_seed );
69+ return ;
7570}
7671
77721;
0 commit comments