Skip to content

Commit 2f2b4f1

Browse files
committed
Clean up PGrandom.pm
This is just code clean up, and part of a push to get the core PG modules in order.
1 parent 9f3f534 commit 2f2b4f1

1 file changed

Lines changed: 36 additions & 41 deletions

File tree

lib/PGrandom.pm

Lines changed: 36 additions & 41 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,63 @@ 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);
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

3534
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);
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

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

6356
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;
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

7772
1;

0 commit comments

Comments
 (0)