úÎàS     Thomas.DuBuisson@gmail.combetaportableNone3457CtSimple users of generators can use CRand for quick and easy generation of randoms. See below for a simple use of  (from "crypto-api"), , , and  runCRandom.V@getRandPair = do int <- getCRandom bytes <- getBytes 100 return (int, bytes)func = do g <- newGenIO case runCRand getRandPair g of Right ((int,bytes), g') -> useRandomVals (int,bytes) Left x -> handleGenError x @5CRandT is the transformer suggested for MonadCRandom. CRandom a is much like the Random class from the  System.RandomZ module in the "random" package. The main difference is CRandom builds on "crypto-api"'s !, so it allows explicit failure.crandomR (low,high) gs as typically instantiated will generate a value between [low, high] inclusively, swapping the pair if high < low.Provided instances for  crandom gI generates randoms between the bounds and between +/- 2^256 for Integer.The ™ function has degraded (theoretically unbounded, probabilistically decent) performance the closer your range size (high - low) is to 2^n (from the top).MonadCRandom mD represents a monad that can produce random values (or fail with a !). It is suggested you use the ! transformer in your monad stack.I  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK+LMNOPQRSTUVWX    <   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKY      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\monad_9rxY8rFHMnIE8lTNUlhUtfControl.Monad.CryptoRandomCRandCRandTunCRandTCRandomRcrandomR crandomRsCRandomcrandomcrandomsContainsGenError toGenError fromGenError MonadCRandomR getCRandomR MonadCRandom getCRandomgetBytesgetBytesWithEntropydoReseed newGenCRand liftCRand liftCRandT runCRandT evalCRandTrunCRand evalCRandcrypt_A5WnkM78khp1E9HeFIfO7N Crypto.RandomnewGenIOCryptoRandomGenGenError crandomR_Numwrapbase2Logbs2i$fMonadCRandomReRWST$fMonadCRandomReRWST0$fMonadCRandomReReaderT$fMonadCRandomReWriterT$fMonadCRandomReWriterT0$fMonadCRandomReStateT$fMonadCRandomReStateT0$fMonadCRandomReCRandT$fMonadCRandomeCRandT$fMonadContCRandT$fMonadWriterwCRandT$fMonadReaderrCRandT$fMonadStatesCRandT$fMonadTransCRandT $fCRandomBool$fCRandomRInt64$fCRandomInt64$fCRandomRInt32$fCRandomInt32$fCRandomRInt16$fCRandomInt16$fCRandomRInt8 $fCRandomInt8$fCRandomRWord64$fCRandomWord64$fCRandomRWord32$fCRandomWord32$fCRandomRWord16$fCRandomWord16$fCRandomRWord8$fCRandomWord8 $fCRandomRInt $fCRandomInt$fCRandomRInteger$fContainsGenErrorGenError$fMonadCRandomeRWST$fMonadCRandomeRWST0$fMonadCRandomeReaderT$fMonadCRandomeWriterT$fMonadCRandomeWriterT0$fMonadCRandomeStateT$fMonadCRandomeStateT0NeedsInfiniteSeedNotEnoughEntropy NeedReseed RangeInvalidRequestedTooManyBytes GenErrorOtherreseedgenBytesWithEntropy reseedPeriod reseedInfogenBytes genSeedLengthnewGen