splitmix: Fast Splittable PRNG
This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.
Pure Haskell implementation of SplitMix described in
Guy L. Steele, Jr., Doug Lea, and Christine H. Flood. 2014.
Fast splittable pseudorandom number generators. In Proceedings
of the 2014 ACM International Conference on Object Oriented
Programming Systems Languages & Applications (OOPSLA '14). ACM,
New York, NY, USA, 453-472. DOI:
https://doi.org/10.1145/2660193.2660195
The paper describes a new algorithm SplitMix for splittable
pseudorandom number generator that is quite fast: 9 64 bit arithmetic/logical
operations per 64 bits generated.
SplitMix is tested with two standard statistical test suites (DieHarder and
TestU01, this implementation only using the former) and it appears to be
adequate for "everyday" use, such as Monte Carlo algorithms and randomized
data structures where speed is important.
In particular, it should not be used for cryptographic or security applications,
because generated sequences of pseudorandom values are too predictable
(the mixing functions are easily inverted, and two successive outputs
suffice to reconstruct the internal state).
[
Skip to Readme]
Properties
Versions |
0, 0.0.1, 0.0.2, 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.1, 0.1.0.1, 0.1.0.2, 0.1.0.3, 0.1.0.4, 0.1.0.5 |
Change log |
Changelog.md |
Dependencies |
base (>=4.3 && <4.13), deepseq (>=1.3.0.0 && <1.5), random (>=1.0 && <1.2), time (>=1.2.0.3 && <1.9) [details] |
License |
BSD-3-Clause |
Author |
|
Maintainer |
Oleg Grenrus <oleg.grenrus@iki.fi> |
Category |
System |
Bug tracker |
https://github.com/phadej/splitmix#issues
|
Source repo |
head: git clone https://github.com/phadej/splitmix.git |
Uploaded |
by phadej at 2019-03-24T19:56:04Z |
Modules
[Index] [Quick Jump]
Downloads
Maintainer's Corner
Package maintainers
For package maintainers and hackage trustees
Readme for splitmix-0.0.2
[
back to package description]
splitmix
Pure Haskell implementation of SplitMix pseudo-random number generator.
dieharder
Dieharder is a random
number generator (rng) testing suite. It is intended to test generators, not
files of possibly random numbers as the latter is a fallacious view of what it
means to be random. Is the number 7 random? If it is generated by a random
process, it might be. If it is made up to serve the purpose of some argument
(like this one) it is not. Perfect random number generators produce "unlikely"
sequences of random numbers – at exactly the right average rate. Testing a rng
is therefore quite subtle.
time $(cabal-plan list-bin splitmix-dieharder) splitmix
The test-suite takes around half-an-hour to complete.
From 30 runs, 2.49% were weak (3247 passed, 83 weak, 0 failed).
In comparison, built-in Marsenne Twister
test takes around 15min.
time dieharder -a
benchmarks
benchmarking list 64/random
time 1.317 ms (1.303 ms .. 1.335 ms)
0.998 R² (0.998 R² .. 0.999 R²)
mean 1.380 ms (1.365 ms .. 1.411 ms)
std dev 70.83 μs (37.26 μs .. 131.8 μs)
variance introduced by outliers: 39% (moderately inflated)
benchmarking list 64/tf-random
time 141.1 μs (140.4 μs .. 142.1 μs)
0.999 R² (0.998 R² .. 1.000 R²)
mean 145.9 μs (144.6 μs .. 150.4 μs)
std dev 7.131 μs (3.461 μs .. 14.75 μs)
variance introduced by outliers: 49% (moderately inflated)
benchmarking list 64/splitmix
time 17.86 μs (17.72 μs .. 18.01 μs)
0.999 R² (0.998 R² .. 1.000 R²)
mean 17.95 μs (17.75 μs .. 18.47 μs)
std dev 1.000 μs (444.1 ns .. 1.887 μs)
variance introduced by outliers: 64% (severely inflated)
benchmarking tree 64/random
time 800.3 μs (793.3 μs .. 806.5 μs)
0.999 R² (0.998 R² .. 0.999 R²)
mean 803.2 μs (798.1 μs .. 811.2 μs)
std dev 22.09 μs (14.69 μs .. 35.47 μs)
variance introduced by outliers: 18% (moderately inflated)
benchmarking tree 64/tf-random
time 179.0 μs (176.6 μs .. 180.7 μs)
0.999 R² (0.998 R² .. 0.999 R²)
mean 172.7 μs (171.3 μs .. 174.6 μs)
std dev 5.590 μs (4.919 μs .. 6.382 μs)
variance introduced by outliers: 29% (moderately inflated)
benchmarking tree 64/splitmix
time 51.54 μs (51.01 μs .. 52.15 μs)
0.999 R² (0.998 R² .. 0.999 R²)
mean 52.50 μs (51.93 μs .. 53.55 μs)
std dev 2.603 μs (1.659 μs .. 4.338 μs)
variance introduced by outliers: 55% (severely inflated)
Note: the performance can be potentially further improved when GHC gets
SIMD Support.