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 #