Safe Haskell | None |
---|---|
Language | Haskell98 |
This module is a Haskell port of the Random123 library (http://www.thesalmons.org/john/random123/). It is based on counter-based pseudo-random number generators (CBRNGs), which are, essentially, keyed bijections which transform successive counters into randomly distributed integers. For details about the theory behind the algorithms along with statistical and performance tests see the paper Salmon et al., P. Int. C. High. Perform. 16 (2011) (http://dx.doi.org/doi:10.1145/2063384.2063405).
The module exposes both bijection functions themselves (for customized approach) and
instances of RandomGen
.
Since CBRNGs are based on bijection functions, their periods are equal to the size of their
corresponding counters.
For example, 32-bit philox4
has Array4
Word32
counter,
therefore the total counter size is 4 * 32 = 128
bit, and the period is 2^128
.
RandomGen
instances use each generated random array for several random integers,
so their periods are several times bigger.
Consider now that the philox4
bijection was used to create a CustomCBRNG64
generator.
For each 64-bit Int
its next
function returns,
it will use two of the elements of the Array4
Word32
,
so the total period is 2 * 2^128 = 2^129
.
Note: There is no point in creating 64-bit RNGs when your platform has only 32-bit Int
s.
The remaining bits will be truncated by next
.
- data CBRNG32
- mkCBRNG32 :: Integer -> CBRNG32
- restoreCBRNG32 :: CBRNGState -> CBRNG32
- data CBRNG64
- mkCBRNG64 :: Integer -> CBRNG64
- restoreCBRNG64 :: CBRNGState -> CBRNG64
- data CustomCBRNG32 k c
- mkCustomCBRNG32 :: LimitedInteger c => (k -> c -> c) -> k -> CustomCBRNG32 k c
- restoreCustomCBRNG32 :: (LimitedInteger k, LimitedInteger c) => (k -> c -> c) -> CBRNGState -> CustomCBRNG32 k c
- data CustomCBRNG64 k c
- mkCustomCBRNG64 :: LimitedInteger c => (k -> c -> c) -> k -> CustomCBRNG64 k c
- restoreCustomCBRNG64 :: (LimitedInteger k, LimitedInteger c) => (k -> c -> c) -> CBRNGState -> CustomCBRNG64 k c
- philox2 :: PhiloxWord a => a -> Array2 a -> Array2 a
- philox4 :: PhiloxWord a => Array2 a -> Array4 a -> Array4 a
- threefry2 :: (ThreefryWord a, Bits a, Num a) => Array2 a -> Array2 a -> Array2 a
- threefry4 :: (ThreefryWord a, Bits a, Num a) => Array4 a -> Array4 a -> Array4 a
Default RNGs
Use these if you want the (usually) optimal bijection algorithm, and serialization capabilities.
Default 32-bit RNG.
Supports serialization through Show
/ Read
interface.
Alternatively, can be serialized with getState
and restored with restoreCBRNG32
.
restoreCBRNG32 :: CBRNGState -> CBRNG32 Source
Restores a default 32-bit RNG from a saved state.
Default 64-bit RNG.
Supports serialization through Show
/ Read
interface.
Alternatively, can be serialized with getState
and restored with restoreCBRNG64
.
restoreCBRNG64 :: CBRNGState -> CBRNG64 Source
Restores a default 64-bit RNG from a saved state.
Custom RNGs
Use these if you want a custom bijection algorithm.
data CustomCBRNG32 k c Source
32-bit RNG with a custom bijection function.
Can be serialized with getState
and restored with restoreCustomCBRNG32
(but it is the user's responsibility to provide the original bijection).
(Counter c, Word32Array c) => RandomGen (CustomCBRNG32 k c) | |
(LimitedInteger k, LimitedInteger c) => SerializableCBRNG (CustomCBRNG32 k c) |
mkCustomCBRNG32 :: LimitedInteger c => (k -> c -> c) -> k -> CustomCBRNG32 k c Source
restoreCustomCBRNG32 :: (LimitedInteger k, LimitedInteger c) => (k -> c -> c) -> CBRNGState -> CustomCBRNG32 k c Source
Restores a custom 32-bit RNG from a saved state.
data CustomCBRNG64 k c Source
64-bit RNG with a custom bijection function.
Can be serialized with getState
and restored with restoreCustomCBRNG32
(but it is the user's responsibility to provide the original bijection).
(Counter c, Word64Array c) => RandomGen (CustomCBRNG64 k c) | |
(LimitedInteger k, LimitedInteger c) => SerializableCBRNG (CustomCBRNG64 k c) |
mkCustomCBRNG64 :: LimitedInteger c => (k -> c -> c) -> k -> CustomCBRNG64 k c Source
restoreCustomCBRNG64 :: (LimitedInteger k, LimitedInteger c) => (k -> c -> c) -> CBRNGState -> CustomCBRNG64 k c Source
Restores a custom 64-bit RNG from a saved state.
Keyed bijection functions
Use these if you want the ultimate control over keys and counters.
Sometimes it is advantageous to bind part of the counter or the key
the node or thread identifier, or to indices of a time or space grid.
You can use liFromInteger
(or just a tuple constructor) to create keys and counters,
and skip
and increment
to change counter values.
If you want further control over the number of rounds in these bijections, see System.Random.Random123.Philox and System.Random.Random123.Threefry modules.
:: PhiloxWord a | |
=> a | key, |
-> Array2 a | counter, |
-> Array2 a | random number. |
Generates a Philox-2 random number with the optimal number of rounds.
:: PhiloxWord a | |
=> Array2 a | key, |
-> Array4 a | counter, |
-> Array4 a | random number. |
Generates a Philox-4 random number with the optimal number of rounds.
Generates a Threefry-2 random number with the optimal number of rounds.