random-source-0.3: Generic basis for random number generators



This module defines the following instances:

 instance RandomSource (ST s) (Gen s)
 instance RandomSource IO (Gen RealWorld)



data Gen s

State of the pseudo-random number generator.


data RealWorld

RealWorld is deeply magical. It is primitive, but it is not unlifted (hence ptrArg). We never manipulate values of type RealWorld; it's only used in the type system, to parameterise State#.

create :: PrimMonad m => m (Gen (PrimState m))

Create a generator for variates using a fixed seed.

initialize :: (PrimMonad m, Vector v Word32) => v Word32 -> m (Gen (PrimState m))

Create a generator for variates using the given seed, of which up to 256 elements will be used. For arrays of less than 256 elements, part of the default seed will be used to finish initializing the generator's state.


 initialize (singleton 42)
 initialize (toList [4, 8, 15, 16, 23, 42])

If a seed contains fewer than 256 elements, it is first used verbatim, then its elements are xored against elements of the default seed until 256 elements are reached.

If a seed contains exactly 258 elements last two elements are used to set generator state. It's to ensure that gen' == gen

 gen' <- initialize . fromSeed =<< save

save :: PrimMonad m => Gen (PrimState m) -> m Seed

Save the state of a Gen, for later use by restore.

restore :: PrimMonad m => Seed -> m (Gen (PrimState m))

Create a new Gen that mirrors the state of a saved Seed.