File Coverage

blib/lib/Data/Gimei/Random.pm
Criterion Covered Total %
statement 26 26 100.0
branch 2 2 100.0
condition 2 3 66.6
subroutine 8 8 100.0
pod 0 4 0.0
total 38 43 88.3


line stmt bran cond sub pod time code
1             package Data::Gimei::Random;
2              
3             # Pseudo random number generator(PRNG)
4             # Park & Miller comp.lang.c FAQ list Question 13.15
5              
6 7     7   6807 use 5.010;
  7         28  
7 7     7   40 use strict;
  7         51  
  7         241  
8 7     7   85 use warnings;
  7         17  
  7         406  
9              
10 7         72 use Class::Tiny qw (
11             seed
12 7     7   621 );
  7         4065  
13              
14             #
15             # Class methods
16             #
17              
18             sub BUILDARGS {
19 12     12 0 637921 my ( $class, @args ) = @_;
20              
21             # Handle single argument as seed
22 12 100       47 if ( @args == 1 ) {
23 4         19 return { seed => $args[0] };
24             }
25              
26 8         19 my %args = @args;
27 8   66     53 $args{'seed'} //= time();
28              
29 8         23 return \%args;
30             }
31              
32             #
33             # Instance methods
34             #
35              
36             sub set_seed {
37 10     10 0 820 my ( $self, $seed ) = @_;
38 10         381 $self->seed($seed);
39             }
40              
41             sub next_int {
42 66     66 0 2682 my ( $self, $size ) = @_;
43              
44 66         1435 my $rnum = ( 48_271 * $self->seed ) % ( 2 << 31 - 1 );
45 66         1281 $self->seed($rnum);
46              
47 66         364 return $rnum % $size;
48             }
49              
50             sub sample {
51 61     61 0 175 my ( $self, $aref ) = @_;
52              
53 61         137 my $index = $self->next_int( $#$aref + 1 );
54              
55 61         345 return $aref->[$index];
56             }
57             1;