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.
- 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
Synopsis
- data Seed = Seed {}
- random :: MonadIO m => m Seed
- from :: Word64 -> Seed
- split :: Seed -> (Seed, Seed)
- nextInteger :: Integer -> Integer -> Seed -> (Integer, Seed)
- nextDouble :: Double -> Double -> Seed -> (Double, Seed)
- goldenGamma :: Word64
- nextWord64 :: Seed -> (Word64, Seed)
- nextWord32 :: Seed -> (Word32, Seed)
- mix64 :: Word64 -> Word64
- mix64variant13 :: Word64 -> Word64
- mix32 :: Word64 -> Word32
- mixGamma :: Word64 -> Word64
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 :: Word64 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 :: Word64 -> Word64 Source #