File: basegen.t

package info (click to toggle)
libmath-random-perl 0.75-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 316 kB
  • sloc: ansic: 1,443; perl: 1,057; makefile: 8
file content (117 lines) | stat: -rw-r--r-- 2,473 bytes parent folder | download
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;