DIEHARD tests suite for Pseudo Random Numbers Generators (PRNG)
Reference: http://webhome.phy.duke.edu/~rgb/General/dieharder.php
The installation procedure (Mac OSX) can be found here
https://gist.github.com/blixt/9abfafdd0ada0f4f6f26
or here
http://macappstore.org/dieharder/
For other operating systems, please search on the web pages.
dieharder [-h] # for inline help
dieharder -l # to get the lists all the avaliable tests
A description of the many tests can be found here:
https://en.wikipedia.org/wiki/Diehard_tests
https://sites.google.com/site/astudyofentropy/background-information/the-tests/dieharder-test-descriptions
https://www.stata.com/support/cert/diehard/randnumb_mt64.out
General theory about PRNG testing can be found here (a reference among many):
http://liu.diva-portal.org/smash/get/diva2:740158/FULLTEXT01.pdf
or here (more oriented to the NIST test suite)
https://www.random.org/analysis/Analysis2005.pdf
https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-22r1a.pdf
In a terminal window execute the following commands for an exhaustive testing ("-a" option).
The "-g 202" option means that the generator is replaced by a text format input file
(use dieharder -h for more details).
cd //..../Desktop/DIEHARD
dieharder -g 202 -f SomeAsciiFile -a > //..../Desktop/DIEHARD/TheResultFile.txt
Be carefull, the complete testing takes several hours (about 5 on my computer)
__________________________________________________________________________________
Maple's Mersenne Twister Generator
Maple help page : RandomTools[MersenneTwister][GenerateInteger]
(see rincluded references to the Mersenne Twister PRNG).
Note: in the sequel this generator will be dubbed mt19937
The Mersenne Twister is implemented in many softwares.
It is higly likely that this PRNG (and the others these softwares propose) have been intensively
tested with one of the existing PRNG testing libraries.
Unfortunately only a few editors have made public the results of these tests (probably because
the implementation in itself is rarely questioned... but a code typo is always a possibility).
One exception is ths software STATA.
A summary of the results can be found here
https://www.stata.com/support/cert/diehard/.
A complete description of the results of the tests passed is given here
https://www.stata.com/support/cert/diehard/randnumb_mt64.out
The classical pattern of the performances of mt19937 can be found here
http://www2.ic.uff.br/~celso/artigos/pjo6.ps.
and the table below comes from it (P means "Passed", F means "Failed"):
____________________________________________________________________________
In the Maple code below, a sequence of N UnsignedInt32 numbers is generated from the
Maple's Mersenne Twister and the result is exported in an ASCII file.
The Seed is set to 1 (SetState(state=1)) to compare, with a small value of N (let's say N=10)
the sequence produced by Maple's mt19937 with the the sequence of the same length generated
by Diehard's mt19937.
To generate this later sequence and save it in file Diehard_mt19937, just run in a terminan window
the command (-S 1 means "seed = 1", -t 10 means "a sequence of length 10"):
dieharder -S 1 -B -o -t 10 > Diehard_mt19937
About the value of N:
In http://webhome.phy.duke.edu/~rgb/General/dieharder.php it's recommend that N be at least
equal to 2.5 million; STATA used N=3 million.
Other web sources say this value is too small.
For N=10 million the Maple's mt19937 doesn't pass the tests successfully.
I used here N=50 million (the resulting ASCII file has size 537 Mo).
Name of the input file.
The file generated by Maple is named Maple_mt19937_N=5e7.txt
One important thing is the preamble of a licit input file.
This preamble must have 6 lines (the value 10 right to count must be set to the value of N).
A licit preamble is of the form.
#==================================================================
# some text indicating the generator used
#==================================================================
type: d
count: 10
numbit: 32
As Maple_mt19937_N=5e7.txt is generated from an ExportMatrix command, this preamble is added
by hand.
Running multiple Diehard tests
To run the same tests used to qualify STATA's Mersenne Twister, open a terminal window,
go to the directory that contains input file Maple_mt19937_N=5e7.txt and run this script:
for i in {0,1,2,3,4,8,9,10,11,12,13,14,15,16}; do
dieharder -g 202 -f Maple_mt19937_N=5e7.txt -d $i >> Diehard___Maple_mt19937_N=5e7
done ;
The results are then forked in the ASCII file Diehard___Maple_mt19937_N=5e7
> |
with(RandomTools[MersenneTwister]):
|
> |
dir := cat("/", currentdir(), "Desktop/DIEHARD/"):
InputFile := cat(dir, "Maple_mt19937_N=5e7.txt"):
|
> |
SetState(state=1);
N := 5*10^7:
st := time():
S := convert([seq(GenerateUnsignedInt32(), i=1..N)], Matrix)^+;
time()-st;
|
|
(1) |
> |
st := time():
ExportMatrix(InputFile, S, format=rectangular, mode=ascii);
time()-st;
|
|
(2) |
Diehard's results
Full test suite (about 5 hours of computational time)
Command :
dieharder -g 202 -f Maple_mt19937_N=5e7.txt -a > Diehard___ALL___Maple_mt19937_N=5e7
The results are compared to those obtained for Diehard's mt19937.
Two ways are used :
- 1 - In a first stage one generates a stream of PRN and store it in an ASCII file (just as we did with Maple).
The whole suite of tests is then run on this file.
Commands (-g 013 codes for mt19937):
dieharder -S 1 -g 013 -o -t 50000000 > Diehard_mt19937_N=5e7.txt
dieharder -g 202 -f Diehard_mt19937_N=5e7.txt -a > Diehard___ALL___Diehard_mt19937_N=5e7
- 2 - The whole suite is run by invoking directectly mt19937 "online"
Commands :
dieharder -S 1 -g 013 -t 50000000 -a > Diehard___ALL___Online
A UNIX diff command has been used to verify that the two files Maple_mt19937_N=5e7.txt and
Diehard_mt19937_N=5e7.txt were identical (thet were).
Note that the Diehard doens't responds identically depending on the stream of random numbers comes from a file
or is generated online (this last [- 2 -] situation seems to give better results).-
Résumé (114 tests):
- * - Maple's and Diehard's mt19937 respond exactly the same way when the stream of random
numbers is read from an ASCII file (8 tests failed (******) and 6 weak (**)).
- * - Diehard's mt19937 fails 0 test and is weak on 4 tests when the stream is generated online
> |
dir := currentdir():
FromMapleFile := cat(dir, "Diehard___ALL___Maple_mt19937_N=5e7"):
FromDiehardFile := cat(dir, "Diehard___ALL___diehard_mt19937_N=5e7"):
FromDiehardNoFile := cat(dir, "Diehard___ALL___Online"):
printf(" ======================|======================|======================|\n"):
printf(" | From Maple's file | From Diehard's File | Diehard online test |\n"):
printf("==========================|======================|======================|======================|\n"):
printf(" test ntup | p.value Assessment | p.value Assessment | p.value Assessment |\n"):
printf("==========================|======================|======================|======================|\n"):
for k from 1 to 9 do
LMF := readline(FromMapleFile):
LDF := readline(FromDiehardFile):
LDNF := readline(FromDiehardNoFile):
end do:
while LMF <> 0 do
if StringTools:-Search("|", LMF) > 0 then
res := StringTools:-StringSplit(LMF, "|")[[1, 2, 5, 6]];
printf("%-20s %3d | %1.7f ", res[1], parse(res[2]), parse(res[3]));
if StringTools:-Search("WEAK" , res[4]) > 0 then printf(" ** |")
elif StringTools:-Search("FAILED", res[4]) > 0 then printf(" ****** |")
else printf(" PASSED |")
end if:
end if:
LMF := readline(FromMapleFile):
if StringTools:-Search("|", LDF) > 0 then
res := StringTools:-StringSplit(LDF, "|")[[5, 6]];
printf(" %1.7f ", parse(res[1]));
if StringTools:-Search(" WEAK" , res[2]) > 0 then printf(" ** |")
elif StringTools:-Search(" FAILED", res[2]) > 0 then printf(" ****** |")
else printf(" PASSED |")
end if:
end if:
LDF := readline(FromDiehardFile):
if StringTools:-Search("|", LDNF) > 0 then
res := StringTools:-StringSplit(LDNF, "|")[[5, 6]];
printf(" %1.7f ", parse(res[1]));
if StringTools:-Search("WEAK" , res[2]) > 0 then printf(" ** |")
elif StringTools:-Search("FAILED", res[2]) > 0 then printf(" ****** |")
else printf(" PASSED |")
end if:
printf("\n"):
end if:
LDNF := readline(FromDiehardNoFile):
end do:
|
======================|======================|======================|
| From Maple's file | From Diehard's File | Diehard online test |
==========================|======================|======================|======================|
test ntup | p.value Assessment | p.value Assessment | p.value Assessment |
==========================|======================|======================|======================|
diehard_birthdays 0 | 0.9912651 PASSED | 0.9912651 PASSED | 0.8284550 PASSED |
diehard_operm5 0 | 0.1802226 PASSED | 0.1802226 PASSED | 0.5550587 PASSED |
diehard_rank_32x32 0 | 0.3099035 PASSED | 0.3099035 PASSED | 0.9575440 PASSED |
diehard_rank_6x8 0 | 0.2577249 PASSED | 0.2577249 PASSED | 0.3915666 PASSED |
diehard_bitstream 0 | 0.5519218 PASSED | 0.5519218 PASSED | 0.9999462 ** |
diehard_opso 0 | 0.1456442 PASSED | 0.1456442 PASSED | 0.7906533 PASSED |
diehard_oqso 0 | 0.4882425 PASSED | 0.4882425 PASSED | 0.9574014 PASSED |
diehard_dna 0 | 0.0102880 PASSED | 0.0102880 PASSED | 0.5149193 PASSED |
diehard_count_1s_str 0 | 0.1471956 PASSED | 0.1471956 PASSED | 0.9517290 PASSED |
diehard_count_1s_byt 0 | 0.1158707 PASSED | 0.1158707 PASSED | 0.1568255 PASSED |
diehard_parking_lot 0 | 0.1148982 PASSED | 0.1148982 PASSED | 0.1611173 PASSED |
diehard_2dsphere 2 | 0.9122204 PASSED | 0.9122204 PASSED | 0.2056657 PASSED |
diehard_3dsphere 3 | 0.9385972 PASSED | 0.9385972 PASSED | 0.3620517 PASSED |
diehard_squeeze 0 | 0.2686977 PASSED | 0.2686977 PASSED | 0.8611266 PASSED |
diehard_sums 0 | 0.1602355 PASSED | 0.1602355 PASSED | 0.5103248 PASSED |
diehard_runs 0 | 0.1235328 PASSED | 0.1235328 PASSED | 0.9402086 PASSED |
diehard_runs 0 | 0.6341956 PASSED | 0.6341956 PASSED | 0.3274267 PASSED |
diehard_craps 0 | 0.0243605 PASSED | 0.0243605 PASSED | 0.1844482 PASSED |
diehard_craps 0 | 0.2952043 PASSED | 0.2952043 PASSED | 0.1407422 PASSED |
marsaglia_tsang_gcd 0 | 0.0000000 ****** | 0.0000000 ****** | 0.5840531 PASSED |
marsaglia_tsang_gcd 0 | 0.0000000 ****** | 0.0000000 ****** | 0.8055035 PASSED |
sts_monobit 1 | 0.9397218 PASSED | 0.9397218 PASSED | 0.9018886 PASSED |
sts_runs 2 | 0.8092469 PASSED | 0.8092469 PASSED | 0.2247600 PASSED |
sts_serial 1 | 0.2902851 PASSED | 0.2902851 PASSED | 0.9223063 PASSED |
sts_serial 2 | 0.9541680 PASSED | 0.9541680 PASSED | 0.6140772 PASSED |
sts_serial 3 | 0.4090798 PASSED | 0.4090798 PASSED | 0.2334754 PASSED |
sts_serial 3 | 0.5474851 PASSED | 0.5474851 PASSED | 0.7370361 PASSED |
sts_serial 4 | 0.7282286 PASSED | 0.7282286 PASSED | 0.2518826 PASSED |
sts_serial 4 | 0.9905724 PASSED | 0.9905724 PASSED | 0.6876253 PASSED |
sts_serial 5 | 0.8297711 PASSED | 0.8297711 PASSED | 0.2123014 PASSED |
sts_serial 5 | 0.9092172 PASSED | 0.9092172 PASSED | 0.3532615 PASSED |
sts_serial 6 | 0.4976615 PASSED | 0.4976615 PASSED | 0.9967160 ** |
sts_serial 6 | 0.9853355 PASSED | 0.9853355 PASSED | 0.5537414 PASSED |
sts_serial 7 | 0.9675717 PASSED | 0.9675717 PASSED | 0.3804243 PASSED |
sts_serial 7 | 0.4446567 PASSED | 0.4446567 PASSED | 0.0923678 PASSED |
sts_serial 8 | 0.7254384 PASSED | 0.7254384 PASSED | 0.4544030 PASSED |
sts_serial 8 | 0.8984816 PASSED | 0.8984816 PASSED | 0.7501155 PASSED |
sts_serial 9 | 0.8255134 PASSED | 0.8255134 PASSED | 0.4260288 PASSED |
sts_serial 9 | 0.6609663 PASSED | 0.6609663 PASSED | 0.5622308 PASSED |
sts_serial 10 | 0.9984397 ** | 0.9984397 ** | 0.5789212 PASSED |
sts_serial 10 | 0.7987434 PASSED | 0.7987434 PASSED | 0.8599317 PASSED |
sts_serial 11 | 0.5552886 PASSED | 0.5552886 PASSED | 0.3546752 PASSED |
sts_serial 11 | 0.4417852 PASSED | 0.4417852 PASSED | 0.5042245 PASSED |
sts_serial 12 | 0.3843880 PASSED | 0.3843880 PASSED | 0.6723639 PASSED |
sts_serial 12 | 0.1514682 PASSED | 0.1514682 PASSED | 0.9428701 PASSED |
sts_serial 13 | 0.5396454 PASSED | 0.5396454 PASSED | 0.5793677 PASSED |
sts_serial 13 | 0.9497671 PASSED | 0.9497671 PASSED | 0.3370774 PASSED |
sts_serial 14 | 0.3616613 PASSED | 0.3616613 PASSED | 0.4372343 PASSED |
sts_serial 14 | 0.3996251 PASSED | 0.3996251 PASSED | 0.5185021 PASSED |
sts_serial 15 | 0.3847188 PASSED | 0.3847188 PASSED | 0.3188851 PASSED |
sts_serial 15 | 0.1012968 PASSED | 0.1012968 PASSED | 0.1631942 PASSED |
sts_serial 16 | 0.9974802 ** | 0.9974802 ** | 0.6645914 PASSED |
sts_serial 16 | 0.1157822 PASSED | 0.1157822 PASSED | 0.3465564 PASSED |
rgb_bitdist 1 | 0.4705599 PASSED | 0.4705599 PASSED | 0.8627740 PASSED |
rgb_bitdist 2 | 0.7578920 PASSED | 0.7578920 PASSED | 0.3296790 PASSED |
rgb_bitdist 3 | 0.9934502 PASSED | 0.9934502 PASSED | 0.5558012 PASSED |
rgb_bitdist 4 | 0.3674201 PASSED | 0.3674201 PASSED | 0.1607977 PASSED |
rgb_bitdist 5 | 0.7930273 PASSED | 0.7930273 PASSED | 0.9999802 ** |
rgb_bitdist 6 | 0.8491477 PASSED | 0.8491477 PASSED | 0.3774760 PASSED |
rgb_bitdist 7 | 0.1537432 PASSED | 0.1537432 PASSED | 0.4715169 PASSED |
rgb_bitdist 8 | 0.9454030 PASSED | 0.9454030 PASSED | 0.9890644 PASSED |
rgb_bitdist 9 | 0.2017856 PASSED | 0.2017856 PASSED | 0.0571014 PASSED |
rgb_bitdist 10 | 0.9989305 ** | 0.9989305 ** | 0.4575834 PASSED |
rgb_bitdist 11 | 0.4441883 PASSED | 0.4441883 PASSED | 0.4960057 PASSED |
rgb_bitdist 12 | 0.7074388 PASSED | 0.7074388 PASSED | 0.6808850 PASSED |
rgb_minimum_distance 2 | 0.9604056 PASSED | 0.9604056 PASSED | 0.8859729 PASSED |
rgb_minimum_distance 3 | 0.5143592 PASSED | 0.5143592 PASSED | 0.3266204 PASSED |
rgb_minimum_distance 4 | 0.3779106 PASSED | 0.3779106 PASSED | 0.3537417 PASSED |
rgb_minimum_distance 5 | 0.4861264 PASSED | 0.4861264 PASSED | 0.9032057 PASSED |
rgb_permutations 2 | 0.9206310 PASSED | 0.9206310 PASSED | 0.8052940 PASSED |
rgb_permutations 3 | 0.9299743 PASSED | 0.9299743 PASSED | 0.2209750 PASSED |
rgb_permutations 4 | 0.8330345 PASSED | 0.8330345 PASSED | 0.5819945 PASSED |
rgb_permutations 5 | 0.2708879 PASSED | 0.2708879 PASSED | 0.9276941 PASSED |
rgb_lagged_sum 0 | 0.0794660 PASSED | 0.0794660 PASSED | 0.9918681 PASSED |
rgb_lagged_sum 1 | 0.5279555 PASSED | 0.5279555 PASSED | 0.1304600 PASSED |
rgb_lagged_sum 2 | 0.0433872 PASSED | 0.0433872 PASSED | 0.1149961 PASSED |
rgb_lagged_sum 3 | 0.0028004 ** | 0.0028004 ** | 0.2731577 PASSED |
rgb_lagged_sum 4 | 0.0000074 ** | 0.0000074 ** | 0.8978870 PASSED |
rgb_lagged_sum 5 | 0.1332411 PASSED | 0.1332411 PASSED | 0.2065880 PASSED |
rgb_lagged_sum 6 | 0.0412128 PASSED | 0.0412128 PASSED | 0.7611867 PASSED |
rgb_lagged_sum 7 | 0.0225446 PASSED | 0.0225446 PASSED | 0.4810145 PASSED |
rgb_lagged_sum 8 | 0.0087433 PASSED | 0.0087433 PASSED | 0.3120378 PASSED |
rgb_lagged_sum 9 | 0.0000000 ****** | 0.0000000 ****** | 0.1334315 PASSED |
rgb_lagged_sum 10 | 0.4147842 PASSED | 0.4147842 PASSED | 0.2334790 PASSED |
rgb_lagged_sum 11 | 0.0206564 PASSED | 0.0206564 PASSED | 0.6491578 PASSED |
rgb_lagged_sum 12 | 0.0755835 PASSED | 0.0755835 PASSED | 0.5332069 PASSED |
rgb_lagged_sum 13 | 0.3112028 PASSED | 0.3112028 PASSED | 0.4194447 PASSED |
rgb_lagged_sum 14 | 0.0000000 ****** | 0.0000000 ****** | 0.2584573 PASSED |
rgb_lagged_sum 15 | 0.0890059 PASSED | 0.0890059 PASSED | 0.0007064 ** |
rgb_lagged_sum 16 | 0.2962076 PASSED | 0.2962076 PASSED | 0.1344984 PASSED |
rgb_lagged_sum 17 | 0.2696070 PASSED | 0.2696070 PASSED | 0.2242021 PASSED |
rgb_lagged_sum 18 | 0.0826388 PASSED | 0.0826388 PASSED | 0.0450341 PASSED |
rgb_lagged_sum 19 | 0.0000000 ****** | 0.0000000 ****** | 0.5508302 PASSED |
rgb_lagged_sum 20 | 0.0101437 PASSED | 0.0101437 PASSED | 0.4290150 PASSED |
rgb_lagged_sum 21 | 0.1417859 PASSED | 0.1417859 PASSED | 0.1624411 PASSED |
rgb_lagged_sum 22 | 0.0160264 PASSED | 0.0160264 PASSED | 0.5204838 PASSED |
rgb_lagged_sum 23 | 0.0535167 PASSED | 0.0535167 PASSED | 0.6571892 PASSED |
rgb_lagged_sum 24 | 0.0000000 ****** | 0.0000000 ****** | 0.8578906 PASSED |
rgb_lagged_sum 25 | 0.8453426 PASSED | 0.8453426 PASSED | 0.3568988 PASSED |
rgb_lagged_sum 26 | 0.2113484 PASSED | 0.2113484 PASSED | 0.9755715 PASSED |
rgb_lagged_sum 27 | 0.1903762 PASSED | 0.1903762 PASSED | 0.4356739 PASSED |
rgb_lagged_sum 28 | 0.0733066 PASSED | 0.0733066 PASSED | 0.8354990 PASSED |
rgb_lagged_sum 29 | 0.0000000 ****** | 0.0000000 ****** | 0.1716599 PASSED |
rgb_lagged_sum 30 | 0.0932124 PASSED | 0.0932124 PASSED | 0.0732090 PASSED |
rgb_lagged_sum 31 | 0.0000000 ****** | 0.0000000 ****** | 0.3497910 PASSED |
rgb_lagged_sum 32 | 0.0843455 PASSED | 0.0843455 PASSED | 0.5441949 PASSED |
rgb_kstest_test 0 | 0.4399862 PASSED | 0.4399862 PASSED | 0.9766581 PASSED |
dab_bytedistrib 0 | 0.0748312 PASSED | 0.0748312 PASSED | 0.7035800 PASSED |
dab_dct 256 | 0.0919474 PASSED | 0.0919474 PASSED | 0.3985889 PASSED |
dab_filltree 32 | 0.1227533 PASSED | 0.1227533 PASSED | 0.7390925 PASSED |
dab_filltree 32 | 0.6819630 PASSED | 0.6819630 PASSED | 0.1773611 PASSED |
dab_filltree2 0 | 0.1774773 PASSED | 0.1774773 PASSED | 0.2088828 PASSED |
dab_filltree2 1 | 0.1718216 PASSED | 0.1718216 PASSED | 0.2257006 PASSED |
dab_monobit2 12 | 0.9999881 ** | 0.9999881 ** | 0.8084149 PASSED |
|
|
|