"The generation of random numbers is too important to be left to chance." – Robert R. Coveyou
An alternate random number generator built around four principles:
-
Statistical Quality. If you use any seed less than 53,668 and generate one bool, it will be
True
– if you're using core'sRandom
module. More sophisticated statistical tests spot patterns in the "random" numbers almost immediately. Would you want to trust the accuracy of your fuzz tests to such a flawed algorithm? This library produces far less predictable and biased output, especially if you use thousands of random numbers. Seetest/dieharder
for more details. -
Useful features. This library exports
constant
andandMap
, which are conspicuously absent from core, along with other helpful functions for composing generators. Particularly interesting isindependentSeed
, which allows for lazy lists and isolated components to generate as much randomness as they need, when they need it. -
Performance. This library will generate floats about 3.5 times faster than core, and ints do not regress. These figures stand to improve pending some optimizations to the compiler. You can see the full benchmark results.
-
Compatibility. This library is a drop-in replacement for core's Random module. Specifically, you can replace
import Random
withimport Random.Pcg as Random
and everything will continue to work. (The one exception is third party libraries like elm-random-extra.)
This is an implementation of PCG by M. E. O'Neil. The generator is not cryptographically secure.
Please report bugs, feature requests, and other issues on GitHub.
- Argument order of
andMap
flipped.
- Upgraded for 0.18.
- Argument order of
andThen
flipped.
- Change implementation to use the RXS-M-SH variant of PCG. Now much faster and not much worse statistically.
- Remove
initialSeed2
, since there are now only 32 bits of state. Random.Pcg.Interop.fission
has been changed to a (core) generator of (PCG) seeds.- Add
generate
to match core 4.x API. Implemented by Richard Feldman.
- Upgraded for 0.17.
generate
renamedstep
to match core 4.x API.- Module renamed
Random.Pcg
fromRandom.PCG
. split
has been removed; useindependentSeed
.minInt
andmaxInt
values changed to match core.