úÎÆ9     portablebetaThomas.DuBuisson@gmail.comNone-Simple 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. 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 6CRandT is the transformer suggested for MonadCRandom.  CRandom a is much like the Random class from the  System.Random module in the random package. * The main difference is CRandom builds on  crypto-api's , so it allows  explicit failure. crandomR (low,high) g9 as typically instantiated will generate a value between  [low, high]( inclusively, swapping the pair if high < low. Provided instances for  crandom g3 generates randoms between the bounds and between +/- 2^256  for Integer. The W function has degraded (theoretically unbounded, probabilistically decent) performance C the closer your range size (high - low) is to 2^n (from the top). MonadCRandom m% 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[\monadcryptorandom-0.5.3Control.Monad.CryptoRandomCRandCRandTCRandomRcrandomR crandomRsCRandomcrandomcrandomsContainsGenError toGenError fromGenError MonadCRandomR getCRandomR MonadCRandom getCRandomgetBytesgetBytesWithEntropydoReseed newGenCRand runCRandT evalCRandTrunCRand evalCRandcrypto-api-0.12.2.2 Crypto.RandomnewGenIOCryptoRandomGenGenErrorunCRandT crandomR_Numwrapbase2Logbs2i$fErrorGenError$fMonadCRandomReRWST$fMonadCRandomReRWST0$fMonadCRandomReReaderT$fMonadCRandomReWriterT$fMonadCRandomReWriterT0$fMonadCRandomReStateT$fMonadCRandomReStateT0$fMonadCRandomReCRandT$fMonadCRandomeCRandT$fMonadContCRandT$fMonadWriterwCRandT$fMonadReaderrCRandT$fMonadStatesCRandT$fMonadTransCRandT$fApplicativeCRandT $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$fMonadCRandomeStateT0 GenErrorOtherRequestedTooManyBytes RangeInvalid NeedReseedNotEnoughEntropyNeedsInfiniteSeedreseedgenBytesWithEntropy reseedPeriod reseedInfogenBytes genSeedLengthnewGen