11package PGrandom ;
22
33use strict;
4+ use warnings;
45
56my $multiplier = 69069;
67
@@ -9,69 +10,64 @@ 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 );
1818 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.
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.
2222 };
2323
24- bless $self , $class ;
25-
26- return $self ;
24+ return bless $self , $class ;
2725}
2826
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 ;
27+ # Perl's % modulus operator does not work for large numbers. So use mod here instead. Although, does this ever actually
28+ # need to handle numbers greater than 2^63 - 1 which is where the % operator fails? I think this dates back to the days
29+ # of 32 bit integers being used.
30+ sub mod {
31+ my ($m , $n ) = @_ ;
32+ return $m - int ($m / $n ) * $n ;
3333}
3434
3535sub 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 );
36+ my ($self , $begin , $end , $incr ) = @_ ;
37+ ++$self -> {number_of_calls };
38+ $incr //= 1;
4339 my $seed = $self -> {' seed' };
4440 my $new_seed = mod($multiplier * $seed + $translate , $modulus );
45- $self -> {' seed' } = $new_seed ;
41+ $self -> {seed } = $new_seed ;
4642
4743 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 ;
44+ # If $incr is less than zero, then return a "continuous" distribution.
45+ return $begin + $incr * int (($new_seed / ($modulus )) * (int (($end - $begin ) / $incr ) + 1));
46+ } else {
47+ return $begin + ($end - $begin ) * $new_seed / $modulus ;
5148 }
52- $out ;
53-
5449}
5550
5651sub rand {
57- my $self = shift ;
58- my $end = shift ;
59- $end = 1 unless defined ($end );
60- $self -> random(0, $end , 0);
52+ my ($self , $end ) = @_ ;
53+ $end //= 1;
54+ return $self -> random(0, $end , 0);
6155}
6256
6357sub 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 ;
58+ my ( $self , $new_seed ) = @_ ;
59+ $self -> { original_seed } = $new_seed ;
60+ $new_seed = mod( $multiplier * $ new_seed + $translate , $modulus ); # reset the seed
61+ $self -> { number_of_calls } = 1;
62+ $self -> {seed } = $new_seed ;
63+ return ;
7064}
7165
72- sub seed { # synonym for srand
73- my $self = shift ;
74- $self -> srand (@_ );
66+ # This is a synonym for srand.
67+ sub seed {
68+ my ($self , $new_seed ) = @_ ;
69+ $self -> srand ($new_seed );
70+ return ;
7571}
7672
77731;
0 commit comments