Safe Haskell | None |
---|---|
Language | Haskell98 |
This is a port of "Fast Splittable Pseudorandom Number Generators" by Steele et. al. [1].
The paper's algorithm provides decent randomness for most purposes but sacrifices cryptographic-quality randomness in favor of speed. The original implementation is tested with DieHarder and BigCrush; see the paper for details.
This implementation, originally from [2], is a port from the paper.
It also takes in to account the SplittableRandom.java source code in OpenJDK v8u40-b25 as well as splittable_random.ml in Jane Street's standard library overlay (kernel) v113.33.03, and Random.fs in FsCheck v3.
Other than the choice of initial seed for from
this port should be
faithful. Currently, we have not rerun the DieHarder, or BigCrush tests on
this implementation.
- Guy L. Steele, Jr., Doug Lea, Christine H. Flood Fast splittable pseudorandom number generators Comm ACM, 49(10), Oct 2014, pp453-472.
- Nikos Baxevanis https://github.com/moodmosaic/SplitMix/blob/master/SplitMix.hs
- data Seed = Seed {}
- random :: MonadIO m => m Seed
- from :: Int64 -> Seed
- split :: Seed -> (Seed, Seed)
- nextInteger :: Integer -> Integer -> Seed -> (Integer, Seed)
- nextDouble :: Double -> Double -> Seed -> (Double, Seed)
- goldenGamma :: Int64
- nextInt64 :: Seed -> (Int64, Seed)
- nextInt32 :: Seed -> (Int32, Seed)
- mix64 :: Int64 -> Int64
- mix64variant13 :: Int64 -> Int64
- mix32 :: Int64 -> Int32
- mixGamma :: Int64 -> Int64
Documentation
A splittable random number generator.
nextInteger :: Integer -> Integer -> Seed -> (Integer, Seed) Source #
Generate a random Integer
in the [inclusive,inclusive] range.
nextDouble :: Double -> Double -> Seed -> (Double, Seed) Source #
Generate a random Double
in the [inclusive,exclusive) range.
Internal
These functions are exported in case you need them in a pinch, but are not part of the public API and may change at any time, even as part of a minor update.
goldenGamma :: Int64 Source #
A predefined gamma value's needed for initializing the "root" instances of
Seed
. That is, instances not produced by splitting an already existing
instance.
We choose: the odd integer closest to 2^64/φ
, where φ = (1 + √5)/2
is
the golden ratio.
mix64variant13 :: Int64 -> Int64 Source #