random-fu- Random number generation



This module provides functions useful for implementing new MonadRandom and RandomSource instances for state-abstractions containing StdGen values (the pure pseudorandom generator provided by the System.Random module in the "random" package), as well as instances for some common cases.



getRandomByteFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word8Source

Given a mutable reference to a RandomGen generator, we can make a RandomSource usable in any monad in which the reference can be modified.

For example, if x :: TVar StdGen, getRandomByteFromRandomGenRef x can be used as a RandomSource in IO, STM, or any monad which is an instance of MonadIO. It's generally probably better to use getRandomWordFromRandomGenRef though, as this one is likely to throw away a lot of perfectly good entropy. Better still is to use these 3 functions together to create a RandomSource instance for the reference you're using, if one does not already exist.

getRandomByteFromRandomGenState :: (RandomGen g, MonadState g m) => m Word8Source

Similarly, getRandomWordFromRandomGenState x can be used in any "state" monad in the mtl sense whose state is a RandomGen generator. Additionally, the standard mtl state monads have MonadRandom instances which do precisely that, allowing an easy conversion of RVars and other Distribution instances to "pure" random variables.