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, 453472. 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 GHC7.0.4,
but GHC7.0 and GHC7.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)
 splitSMGen :: SMGen > (SMGen, SMGen)
 bitmaskWithRejection32 :: Word32 > SMGen > (Word32, 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  
RandomGen SMGen Source #  
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
Generation
bitmaskWithRejection32 :: Word32 > SMGen > (Word32, SMGen) Source #
Bitmask with rejection method of generating subrange of Word32
.
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 closedopen
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
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