Provided by: libstatistics-test-sequence-perl_0.01-2_all #### 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.)

```

#### SEEALSO

```       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 (C) 2007 by Steffen Mueller