Safe Haskell | Trustworthy |
---|---|
Language | Haskell2010 |
SplitMix is a splittable pseudorandom number generator (PRNG) that is quite fast.
Guy L. Steele, Jr., Doug Lea, and Christine H. Flood. 2014. Fast splittable pseudorandom number generators. In Proceedings of the 2014 ACM International Conference on Object Oriented Programming Systems Languages & Applications (OOPSLA '14). ACM, New York, NY, USA, 453-472. DOI: https://doi.org/10.1145/2660193.2660195
The paper describes a new algorithm SplitMix for splittable pseudorandom number generator that is quite fast: 9 64 bit arithmetic/logical operations per 64 bits generated.
SplitMix is tested with two standard statistical test suites (DieHarder and TestU01, this implementation only using the former) and it appears to be adequate for "everyday" use, such as Monte Carlo algorithms and randomized data structures where speed is important.
In particular, it should not be used for cryptographic or security applications , because generated sequences of pseudorandom values are too predictable (the mixing functions are easily inverted, and two successive outputs suffice to reconstruct the internal state).
Note: This module supports all GHCs since GHC-7.0.4,
but GHC-7.0 and GHC-7.2 have slow implementation, as there
are no native
popCount
.
Synopsis
- data SMGen
- nextWord64 :: SMGen -> ( Word64 , SMGen )
- nextWord32 :: SMGen -> ( Word32 , SMGen )
- nextTwoWord32 :: SMGen -> ( Word32 , Word32 , SMGen )
- nextInt :: SMGen -> ( Int , SMGen )
- nextDouble :: SMGen -> ( Double , SMGen )
- nextFloat :: SMGen -> ( Float , SMGen )
- nextInteger :: Integer -> Integer -> SMGen -> ( Integer , SMGen )
- splitSMGen :: SMGen -> ( SMGen , SMGen )
- bitmaskWithRejection32 :: Word32 -> SMGen -> ( Word32 , SMGen )
- bitmaskWithRejection32' :: Word32 -> SMGen -> ( Word32 , SMGen )
- bitmaskWithRejection64 :: Word64 -> SMGen -> ( Word64 , SMGen )
- bitmaskWithRejection64' :: Word64 -> SMGen -> ( Word64 , SMGen )
- mkSMGen :: Word64 -> SMGen
- initSMGen :: IO SMGen
- newSMGen :: IO SMGen
- seedSMGen :: Word64 -> Word64 -> SMGen
- seedSMGen' :: ( Word64 , Word64 ) -> SMGen
- unseedSMGen :: SMGen -> ( Word64 , Word64 )
Documentation
SplitMix generator state.
Instances
Read SMGen Source # |
|
Show SMGen Source # | |
NFData SMGen Source # | |
Defined in System.Random.SplitMix |
nextWord64 :: SMGen -> ( Word64 , SMGen ) Source #
Generate a
Word64
.
>>>
take 3 $ map (printf "%x") $ unfoldr (Just . nextWord64) (mkSMGen 1337) :: [String]
["b5c19e300e8b07b3","d600e0e216c0ac76","c54efc3b3cc5af29"]
nextWord32 :: SMGen -> ( Word32 , SMGen ) Source #
Generate
Word32
by truncating
nextWord64
.
Since: 0.0.3
nextDouble :: SMGen -> ( Double , SMGen ) Source #
Generate a
Double
in
[0, 1)
range.
>>>
take 8 $ map (printf "%0.3f") $ unfoldr (Just . nextDouble) (mkSMGen 1337) :: [String]
["0.710","0.836","0.771","0.409","0.297","0.527","0.589","0.067"]
nextFloat :: SMGen -> ( Float , SMGen ) Source #
Generate a
Float
in
[0, 1)
range.
>>>
take 8 $ map (printf "%0.3f") $ unfoldr (Just . nextFloat) (mkSMGen 1337) :: [String]
["0.057","0.089","0.237","0.383","0.680","0.320","0.826","0.007"]
Since: 0.0.3
nextInteger :: Integer -> Integer -> SMGen -> ( Integer , SMGen ) Source #
Generate an
Integer
in closed
[x, y]
range.
splitSMGen :: SMGen -> ( SMGen , SMGen ) Source #
Split a generator into a two uncorrelated generators.
Generation
bitmaskWithRejection32 :: Word32 -> SMGen -> ( Word32 , SMGen ) Source #
Bitmask with rejection
method of generating subrange of
Word32
.
bitmaskWithRejection32 w32
generates random numbers in closed-open
range of
[0, w32)
.
Since: 0.0.3
bitmaskWithRejection32' :: Word32 -> SMGen -> ( Word32 , SMGen ) Source #
Bitmask with rejection
method of generating subrange of
Word32
.
bitmaskWithRejection32' w32
generates random numbers in closed-closed
range of
[0, w32]
.
Since: 0.0.4
bitmaskWithRejection64 :: Word64 -> SMGen -> ( Word64 , SMGen ) Source #
Bitmask with rejection
method of generating subrange of
Word64
.
bitmaskWithRejection64 w64
generates random numbers in closed-open
range of
[0, w64)
.
>>>
take 20 $ unfoldr (Just . bitmaskWithRejection64 5) (mkSMGen 1337)
[3,1,4,1,2,3,1,1,0,3,4,2,3,0,2,3,3,4,1,0]
Since: 0.0.3
bitmaskWithRejection64' :: Word64 -> SMGen -> ( Word64 , SMGen ) Source #
Bitmask with rejection
method of generating subrange of
Word64
.
bitmaskWithRejection64' w64
generates random numbers in closed-closed
range of
[0, w64]
.
>>>
take 20 $ unfoldr (Just . bitmaskWithRejection64' 5) (mkSMGen 1337)
[3,1,4,1,2,3,1,1,0,3,4,5,2,3,0,2,3,5,3,4]
Since: 0.0.4
Initialisation
mkSMGen :: Word64 -> SMGen Source #
Preferred way to deterministically construct
SMGen
.
>>>
mkSMGen 42
SMGen 9297814886316923340 13679457532755275413
Derive a new generator instance from the global
SMGen
using
splitSMGen
.
Create
SMGen
using seed and gamma.
>>>
seedSMGen 2 2
SMGen 2 3