1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#! perl
use Test2::V0;
use Math::Random qw(
random_advance_state
random_get_generator_num
random_get_seed
random_init_generator
random_integer
random_set_antithetic
random_set_generator_num
random_set_seed_from_phrase
random_uniform
);
sub init_seed {
random_set_seed_from_phrase( 'common seed' );
}
subtest 'generator number' => sub {
init_seed;
is( random_get_generator_num(), 1, 'default generator number' );
my $gen = 32;
is( random_set_generator_num( $gen ), 1, 'set new, returned old' );
is( random_get_generator_num, $gen, 'new was set' );
};
subtest 'advance state' => sub {
init_seed;
my $r;
my $k = 1;
$r = random_integer for 0 .. 2**$k;
init_seed;
random_advance_state( $k );
is( random_integer(), $r );
};
subtest 'antithetic' => sub {
init_seed;
my $u1 = random_uniform();
init_seed;
random_set_antithetic( 1 );
my $u1_anti = random_uniform();
random_set_antithetic( 0 ); # Turn off
is( $u1_anti, float( 1 - $u1 ) );
};
subtest 'random_init_generator' => sub {
subtest 'reset to start' => sub {
init_seed;
my @s1 = random_get_seed;
my $r1 = random_integer; # first random
random_integer for 0 .. 100;
# reset to initial seed
random_init_generator( -1 );
my @s2 = random_get_seed;
my $r2 = random_integer; # first random
is( \@s2, \@s1, 'same seed' );
is( $r2, $r1, 'same number' );
};
subtest 'set to current block' => sub {
init_seed;
my @s0 = random_get_seed;
# move forward one block
random_init_generator( 1 );
my @s1 = random_get_seed;
isnt( \@s1, \@s0, 'moved to next block' );
# move forward some amount
random_integer for 0 .. 100;
my @s2 = random_get_seed;
isnt( \@s2, \@s1, 'moved within block' );
# reset to start of block
random_init_generator( 0 );
my @s3 = random_get_seed;
is( \@s3, \@s1, 'seed for current block' );
};
subtest 'set to next block' => sub {
init_seed;
# move to next block
random_init_generator( 1 );
my @s1 = random_get_seed;
# reset
init_seed;
# move to next block
random_advance_state( 30 );
my @s2 = random_get_seed;
is( \@s2, \@s1, 'got correct seeds' );
};
};
done_testing;
|