Skip to content

Commit b957a37

Browse files
committed
Clean up PGrandom.pm
1 parent e6aa246 commit b957a37

1 file changed

Lines changed: 35 additions & 39 deletions

File tree

lib/PGrandom.pm

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package PGrandom;
22

33
use strict;
4+
use warnings;
45

56
my $multiplier = 69069;
67

@@ -9,69 +10,64 @@ my $translate = 1;
910
my $modulus = 2**32;
1011

1112
sub 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

3535
sub 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

5651
sub 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

6357
sub 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

7773
1;

0 commit comments

Comments
 (0)