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`

.

`>>>`

["e0cfe722","a6ced0f0","c3a6d889"]`take 3 $ map (printf "%x") $ unfoldr (Just . nextWord32) (mkSMGen 1337) :: [String]`

nextDouble :: SMGen -> (Double, SMGen) Source #

Generate a `Double`

in `[0, 1)`

range.

`>>>`

["0.878","0.764","0.063","0.845","0.262","0.490","0.176","0.544"]`take 8 $ map (printf "%0.3f") $ unfoldr (Just . nextDouble) (mkSMGen 1337) :: [String]`

nextFloat :: SMGen -> (Float, SMGen) Source #

Generate a `Float`

in `[0, 1)`

range.

`>>>`

["0.878","0.652","0.764","0.631","0.063","0.180","0.845","0.645"]`take 8 $ map (printf "%0.3f") $ unfoldr (Just . nextFloat) (mkSMGen 1337) :: [String]`

nextInteger :: Integer -> Integer -> SMGen -> (Integer, SMGen) Source #

Generate an `Integer`

in closed `[x, y]`

range.

# Generation

bitmaskWithRejection32 :: Word32 -> SMGen -> (Word32, SMGen) Source #

*Bitmask with rejection* method of generating subrange of `Word32`

.

bitmaskWithRejection32' :: Word32 -> SMGen -> (Word32, SMGen) Source #

*Bitmask with rejection* method of generating subrange of `Word32`

.

*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)`

.

`>>>`

[0,2,4,2,1,4,2,4,2,2,3,0,3,2,2,2,3,1,2,2]`take 20 $ unfoldr (Just . bitmaskWithRejection64 5) (mkSMGen 1337)`

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]`

.

`>>>`

[0,2,4,2,1,4,2,4,5,5,2,2,5,3,5,0,3,2,2,2]`take 20 $ unfoldr (Just . bitmaskWithRejection64' 5) (mkSMGen 1337)`

*Since: 0.0.4*

# Initialisation

mkSMGen :: Word32 -> SMGen Source #

Preferred way to deterministically construct `SMGen`

.

`>>>`

SMGen 142593372 1604540297`mkSMGen 42`

Derive a new generator instance from the global `SMGen`

using `splitSMGen`

.

Create `SMGen`

using seed and gamma.

`>>>`

SMGen 2 3`seedSMGen 2 2`