File Coverage

blib/lib/Math/RNG/Microsoft/FCPro.pm
Criterion Covered Total %
statement 42 46 91.3
branch 7 10 70.0
condition n/a
subroutine 13 14 92.8
pod 3 3 100.0
total 65 73 89.0


line stmt bran cond sub pod time code
1             package Math::RNG::Microsoft::FCPro;
2             $Math::RNG::Microsoft::FCPro::VERSION = '0.4.0';
3 2     2   347221 use 5.014;
  2         7  
4 2     2   8 use strict;
  2         5  
  2         46  
5 2     2   8 use warnings;
  2         4  
  2         148  
6 2     2   420 use integer;
  2         16  
  2         13  
7 2     2   1531 use bigint;
  2         9336  
  2         13  
8              
9              
10 2     2   206611 use parent 'Math::RNG::Microsoft::Base';
  2         4  
  2         20  
11              
12             my $MAX_SEED = ( ( 1 << ( 31 + 2 ) ) - 1 ); # 33 bits
13              
14             sub new
15             {
16 4     4 1 9344 my $class = shift;
17              
18 4         22 my $self = bless {}, $class;
19              
20 4         16 $self->_init(@_);
21              
22 4         12 return $self;
23             }
24              
25             sub _seed
26             {
27 52     52   84 my $self = shift;
28              
29 52 100       117 if (@_)
30             {
31 4         48 $self->{_seed} = shift;
32             }
33              
34 52         165 return $self->{_seed};
35             }
36              
37             sub _seedx
38             {
39 76     76   15316 my $self = shift;
40              
41 76 100       215 if (@_)
42             {
43 28         74 $self->{_seedx} = shift;
44             }
45              
46 76         191 return $self->{_seedx};
47             }
48              
49             my $X = hex("0x100000000");
50              
51             sub _init
52             {
53 4     4   16 my ( $self, %args ) = @_;
54              
55 4         11 my $seed = $self->_seed( $args{seed} );
56 4 50       74 $self->_seedx( ( $seed < $X ) ? $seed : ( $seed - $X ) );
57 4         21 return;
58             }
59              
60             sub rand
61             {
62 24     24 1 46 my ( $self, ) = @_;
63              
64 24 50       48 if ( $self->_seed < $X )
65             {
66 24         2946 my $ret = $self->_rando();
67 24 50       13122 return ( ( $self->_seed < 0x80000000 ) ? $ret : ( $ret | 0x8000 ) );
68             }
69             else
70             {
71 0         0 return $self->_randp() + 1;
72             }
73             }
74              
75             sub _rando
76             {
77 24     24   36 my $self = shift;
78 24         42 $self->_seedx( ( $self->_seedx() * 214013 + 2531011 ) & $MAX_SEED );
79 24         110 return ( ( $self->_seedx >> 16 ) & 0x7fff );
80             }
81              
82             sub _randp
83             {
84 0     0   0 my $self = shift;
85 0         0 $self->_seedx( ( $self->_seedx() * 214013 + 2531011 ) & $MAX_SEED );
86 0         0 return ( ( $self->_seedx >> 16 ) & 0xffff );
87             }
88              
89             sub max_rand
90             {
91 18     18 1 63 my ( $self, $max ) = @_;
92              
93 18         67 return ( $self->rand() % $max );
94             }
95              
96              
97             1;
98              
99             __END__