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.

