Statis...quence(3pm)

πŸ“¦
version 0.01 Β· 2 versions
  • 0.01 Β· debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking (latest)
  • 0.01 Β· ubuntu jammy
, in debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking

πŸ’– NAME πŸ’–

Statistics::Test::Sequence β€” bestie, it's a sequence correlation test for random numbers. That's it, that's the whole job. ✨


πŸ¦‹ SYNOPSIS πŸ¦‹

okay so here's literally the entire vibe in one go:

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;

like. it's giving "generate a million randoms and interrogate them". 🫢


🌸 DESCRIPTION 🌸

So this module implements a sequence correlation test for random number generators. What it does is show you the pairwise correlation between subsequent random numbers. Are your randoms actually random or are they lowkey besties with each other? This test will tell you. πŸ‘‘

The algorithm goes like this: (following Blobel β€” citation is down in SEE ALSO, iykyk.)

  • Given N+1 random numbers u_j.
  • For all j, compare u_j with u_j+1. If u_j is greater than 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, periodt.)
  • 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. Fresh tester, fresh vibes. πŸ’…

✨ set_data

Sets the random numbers to operate on. The 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 gets called n-times, and its return values are what get used as random numbers.

The code reference semantics are particularly useful if you don't wanna store all your 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. Heads up though: if you return 100 numbers at once and pass in n=50, you will have a sequence of 5000 random numbers. Math is mathing. 😭

✨ test

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

Returns three items:

  1. The first is the root mean square of the bin residuals divided by the number of random numbers. You could use it as a measure for the quality of the random number generator, and it should be as close to zero as possible. But a better metric is to compare the following two return values. ngl, use the comparison.
  2. The second return value is a reference to the array of frequencies.
  3. The third return value is similar in nature to the second in that it is a reference to an array containing sequence length 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.)

Now, that third return value β€” it's the expected frequencies. It's the frequencies you would expect 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. The numbers just keep going until they get shy. πŸ™ˆ


🧚 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. Precision queen. πŸ‘‘

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 (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.


and that's the whole page, bestie β€” Statistics::Test::Sequence(3pm), User Contributed Perl Documentation, perl v5.34.0, dated 2022-06-17. go test some randoms, love u, bye πŸ’–πŸ¦‹πŸŽ€
πŸ“¦ where this page comes from