User Tools

Site Tools


development:testing_and_prng

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

development:testing_and_prng [2025/10/30] – created hayatidevelopment:testing_and_prng [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
 +~~NOTRANS~~
 +{{indexmenu_n>1000}}
 +
 +====== Testing, Reproducibility and Random Numbers ======
 +
 +===== General =====
 +
 +Software needs testing .. and many tests can be automized with unittests - or integration tests.\\
 +The program/test should be reproducible to allow (later) debugging/fixing.
 +
 +===== Crash early! =====
 +
 +Especially when the program or it's results must be reliable, **crashing early** might be advised!\\
 +In this case, additional checks should be enforced and executed. Note, that the C ''assert()'' is removed in non-debug compiled binaries.
 +
 +Besides executing explicitly programmed checks, there are also other possibilities:
 +  * setup signal handler, e.g. segmentation fault (SIGSEGV)
 +  * setup floating point traps, see [[development:numeric_math|Numeric / Math / Linear Algebra]]
 +  * compile with automatic checks
 +    * see https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html for
 +      * ''_GLIBCXX_DEBUG''
 +      * ''_GLIBCXX_ASSERTIONS''
 +      * ''_GLIBCXX_SANITIZE_VECTOR''
 +    * see https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html for
 +      * sanitizers like the prominent AddressSanitizer 'ASan'
 +      * stack-protector
 +      * and others
 +
 +A welcomed side effect of crashing early:\\
 +the stack trace and the visible variable contents might reveal the initial cause of the problem\\
 +- at least with a much higher probability than after having continued and covered the problem.
 +
 +
 +===== Core-Dumps =====
 +
 +A core-dump / minidump mechanism might be of interest.\\
 +For tracking very rare or specific errors, this mechanism might also get delivered to customers.
 +
 +
 +===== Pseudo Random Number Generators (PRNG) =====
 +
 +For tests, a huge amount of '//random//' numbers can be generated, from one //seed//-number.\\
 +There's no need to have a cryptographically safe PRNG.\\
 +Test with defined //seed//-numbers or simply log/save the used seed number.
 +
 +==== Algorithms / Libraries ====
 +
 +=== Properties ===
 +
 +  * size of the //seed// or //state//
 +    * small size is of interest to use one PRNG per thread
 +  * quick initialization from seed
 +  * speed, for producing next number
 +  * period size - until the sequence repeats
 +
 +=== Linear congruential generator (LCG) ===
 +
 +//LCG// is perhaps the simplest (and fastest) algorithm with a small seed; see https://en.wikipedia.org/wiki/Linear_congruential_generator
 +
 +//Fast skipping// might be of interest; see https://www.nayuki.io/page/fast-skipping-in-a-linear-congruential-generator
 +
 +=== Xorshift ===
 +
 +Also a very fast PRNG. Here some links
 +
 +  * https://en.wikipedia.org/wiki/Xorshift
 +  * [[https://prng.di.unimi.it/|xoshiro / xoroshiro generators]]
 +  * http://pracrand.sourceforge.net/
 +  * https://sourceforge.net/projects/gjrand/
 +  * http://simul.iro.umontreal.ca/testu01/tu01.html
 +
 +=== Mersenne Twister ===
 +
 +This PRNG got hyped in the C++ community for it's ridiculously huge period size - but has a big seed size and it's initialization isn't the fastest. IMHO, in most applications, the huge period size isn't necessary.
 +
 +Anyway, here a link to a SIMD-oriented implementation: http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/SFMT/index.html
 +
 +=== Other Links ===
 +
 +  * PCG - comparison of Mersenne Twister, Arc4, ..
 +    * https://www.pcg-random.org/
 +  * 64 bit version of Mersenne Twister
 +    * http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/emt64.html
 +      * https://www.reddit.com/r/programming/comments/2momvr/pcg_a_family_of_better_random_number_generators/
 +      * https://github.com/imneme/pcg-cpp
 +  * https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
 +  * CppCon 2016: Cheinan Marks “I Just Wanted a Random Integer!
 +    * https://www.youtube.com/watch?v=4_QO1nm7uJs
 +  * CppCon 2016: Walter E. Brown "What C++ Programmers Need to Know about Header <random>"
 +    * https://www.youtube.com/watch?v=6DPkyvkMkk8
 +  * CppCon 2022: Roth Michaels "Fast, High-Quality Pseudo-Random Numbers for Non-Cryptographers"
 +    * https://www.youtube.com/watch?v=I5UY3yb0128
 +    * https://github.com/CppCon/CppCon2022/blob/main/Presentations/Fast-High-Quality-Pseudo-Random-Numbers-CPPCon2022-Roth-Michaels.pdf
 +  * Vectorized (SIMD) generation
 +    * https://lemire.me/blog/2018/07/23/are-vectorized-random-number-generators-actually-useful/
 +    * https://forum.juce.com/t/fast-simd-based-random-number-generator-whether-and-how-to-vectorize-random-nextint/44430
 +  * Github
 +    * https://github.com/imneme/pcg-cpp
 +    * https://github.com/DEShawResearch/random123
 +    * https://github.com/Reputeless/Xoshiro-cpp
 +