Safe Haskell | Trustworthy |
---|---|
Language | Haskell2010 |
SplitMix is a splittable pseudorandom number generator (PRNG) that is quite fast.
This is 32bit variant (original one is 32 bit).
You really don't want to use this one .
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
- nextWord32 :: SMGen -> ( Word32 , SMGen )
- nextWord64 :: SMGen -> ( Word64 , 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 :: Word32 -> SMGen
- initSMGen :: IO SMGen
- newSMGen :: IO SMGen
- seedSMGen :: Word32 -> Word32 -> SMGen
- seedSMGen' :: ( Word32 , Word32 ) -> SMGen
- unseedSMGen :: SMGen -> ( Word32 , Word32 )
Documentation
SplitMix generator state.
nextWord32 :: SMGen -> ( Word32 , SMGen ) Source #
Generate a
Word32
.
>>>
take 3 $ map (printf "%x") $ unfoldr (Just . nextWord32) (mkSMGen 1337) :: [String]
["e0cfe722","a6ced0f0","c3a6d889"]
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.878","0.764","0.063","0.845","0.262","0.490","0.176","0.544"]
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.878","0.652","0.764","0.631","0.063","0.180","0.845","0.645"]
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)
.
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)
[0,2,4,2,1,4,2,4,2,2,3,0,3,2,2,2,3,1,2,2]
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)
[0,2,4,2,1,4,2,4,5,5,2,2,5,3,5,0,3,2,2,2]
Since: 0.0.4
Initialisation
mkSMGen :: Word32 -> SMGen Source #
Preferred way to deterministically construct
SMGen
.
>>>
mkSMGen 42
SMGen 142593372 1604540297
Derive a new generator instance from the global
SMGen
using
splitSMGen
.
Create
SMGen
using seed and gamma.
>>>
seedSMGen 2 2
SMGen 2 3