Random123 ========= This is a Haskell port of counter-based random number generators from `Random123 library `_ v1.07 (with a minor bugfix). The description of algorithms can be also found in `Salmon et al., P. Int. C. High. Perform. 16 (2011) `_. Contributing ------------ When making changes to the library, run (or update, if necessary) functionality tests. This can be done as :: $ cabal configure --enable-tests $ cabal build $ cabal test or just by executing ``cd test; ./test.sh``. You can also check the performance by running benchmarks as :: $ cabal configure --enable-benchmarks $ cabal build $ cabal bench or by executing ``cd test; ./test_perf.sh``. Benchmarks will create a report file ``test_perf.html`` in the folder where they were executed from. TODO ---- * Performance issues: * According to Salmon et al., Threefry-4x64 should be the fastest algorithm on CPUs. This is not what I'm seeing; need to investigate it further. If it is made faster, it should be used as the default bijection for ``CBRNG32/64`` instead of ``philox4``. * ``mulhilo`` function in 64-bit Philox is not optimal in terms of performance. It can be made faster given the access to CPU intrinsics. * 32-bit Threefry shows suprisingly low performance (see ``Bijection`` benchmark group). * In general, there seems to be a lot of optimizations that can be done, in particular in terms of strategically placed strictness enforcement. * Current ``split`` implementation is a quick solution that kind of works (much like ``StdGen``'s one). A mathematically robust implementation is required (and CBRNGs by nature should be well-suited for this). Moreover, it would be great to have some tests that could distinguish "bad" ``split`` from a "good" one.