Statis...quence(3pm)
π 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+1random numbersu_j. - For all
j, compareu_jwithu_j+1. Ifu_jis greater thanu_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
kof 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
kin the set ofN+1random 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:
- 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.
- The second return value is a reference to the array of frequencies.
- 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/randomwhere 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.
and that's the whole page, bestie βStatistics::Test::Sequence(3pm), User Contributed Perl Documentation,perl v5.34.0, dated2022-06-17. go test some randoms, love u, bye ππ¦π
π¦ where this page comes from
- debian bookworm: libstatistics-test-sequence-perl 0.01-3 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- debian trixie: libstatistics-test-sequence-perl 0.01-3 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu noble: libstatistics-test-sequence-perl 0.01-3 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu resolute: libstatistics-test-sequence-perl 0.01-3 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu stonking: libstatistics-test-sequence-perl 0.01-3 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms