Provided by: libstatistics-test-sequence-perl_0.01-3_all bug

NAME

       Statistics::Test::Sequence - Sequence correlation test for random numbers

SYNOPSIS

         use Statistics::Test::Sequence;
         my $tester = Statistics::Test::Sequence->new();
         $tester->set_data( [map {rand()} 1..1000000] );

         my ($metric, $actual_freq, $expected_freq) = $tester->test();
         use Data::Dumper;
         print "$metric\n";
         print "Frequencies:\n";
         print Dumper $actual_freq;
         print "Expected frequencies:\n";
         print Dumper $expected_freq;

DESCRIPTION

       This module implements a sequence correlation test for random number generators. It shows pairwise
       correlation between subsequent random numbers.

       The algorithm is as follows: (Following Blobel. Citation in SEE ALSO section.)

       • Given "N+1" random numbers "u_j".

       • For  all  "j",  compare  "u_j"  with  "u_j+1".  If "u_j" is greater then "u_j+1", assign a 0-Bit to the
         number. Otherwise, assign a 1-Bit.

       • Find all sequences of equal Bits. For every sequence, increment a counter for the length  "k"  of  that
         sequence. (Regardless of whether it's a sequence of 1's or 0's.)

       • For  uncorrelated random numbers, the number of sequences N(k) of length "k" in the set of "N+1" random
         numbers is expected to be:

           N(k) = 2*((k^2+3*k+1)*N - (k^3+3*k^2-k-4)) / (k+3)!

METHODS

   new
       Creates a new random number tester.

   set_data
       Sets the random numbers to operate on. First argument must be either an array reference to  an  array  of
       random numbers or a code reference.

       If the first argument is a code reference, the second argument must be an integer "n". The code reference
       is called "n"-times and its return values are used as random numbers.

       The  code  reference semantics are particularily useful if you do not want to store all random numbers in
       memory at the same time. You can write a subroutine that, for example, generates and returns  batches  of
       100  random numbers so no more than 101 of these numbers will be in memory at the same time. Note that if
       you return 100 numbers at once and pass in "n=50", you will have a sequence of 5000 random numbers.

   test
       Runs the sequence test on the data that was previously set using "set_data".

       Returns three items: The first is the root mean square of the bin residuals  divided  by  the  number  of
       random  numbers.  It could be used as a measure for the quality of the random number generator and should
       be as close to zero as possible. A better metric is to compare the following two return values.

       The second return value is a reference to the array  of  frequencies.   An  example  is  in  order  here.
       Generating one million random numbers, I get:

         [0, 416765, 181078, 56318, 11486, 1056, 150]

       This  means  there were no sequences of length 0 (obvious), 416765 sequences of length 1, etc. There were
       no sequences of length 7 or greater. This example is a  bad  random  number  generator!  (It's  a  linear
       congruent generator with "(a*x_i+c)%m" and "a=421", "c=64773", "m=259200", and "x_0=4711").

       The  third  return  value  is  similar  in  nature  to  the  second in that it is a reference to an array
       containing sequence length frequencies.  This one,  however,  contains  the  frequencies  that  would  be
       expected  for  the  given  number  of random numbers, were they uncorrelated.  The number of bins has the
       maximum length of an occurring sequence as an upper limit. In the given example, you would  get:  (Dumped
       with Data::Dumper)

         $VAR1 = [
                   '0',
                   '416666.75',
                   '183333.1',
                   '52777.64722222222222222222222222222222222',
                   '11507.89523809523809523809523809523809524',
                   '2033.72068452380952380952380952380952381',
                   '303.1287808641975308641975308641975308642',
                   # ...
                 ];

       Note that where I put in a "# ...", you would really see a couple more lines of numbers until the numbers
       go  below  an expected frequency of 0.1.  For "n=1000000" and "k=7", you get about 39 sequences, "k=8" is
       expected to be found 4-5 times, etc.

SUBROUTINES

   expected_frequency
       Returns the expected frequency of the sequence length "k"  in  a  set  of  "n"  random  numbers  assuming
       uncorrelated random numbers.

       Returns this as a Math::BigFloat.

       Expects "k" and "n" as arguments.

       This subroutine is memoized. (See Memoize.)

   faculty
       Computes the factulty of the first argument recursively as a Math::BigFloat. This subroutine is memoized.
       (See Memoize.)

SEE ALSO

       Math::BigFloat, Memoize, Params::Util

       Random   number   generators:   Math::Random::MT,   Math::Random,   Math::Random::OO,  Math::TrulyRandom,
       "/dev/random" where available

       The algorithm was taken from: (German)

       Blobel, V., and Lohrmann, E. Statistische und numerische Methoden der Datenanalyse.  Stuttgart,  Leipzig:
       Teubner, 1998

AUTHOR

       Steffen Mueller, <smueller@cpan.org>

COPYRIGHT AND LICENSE

       Copyright (C) 2007 by Steffen Mueller

       This  library  is  free  software;  you can redistribute it and/or modify it under the same terms as Perl
       itself, either Perl version 5.6 or, at your option, any later version of Perl 5 you may have available.

perl v5.34.0                                       2022-06-17                    Statistics::Test::Sequence(3pm)