Safe Haskell | None |
---|---|
Language | Haskell98 |
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.
Synopsis
- data StdGen
- mkStdGen :: Int -> StdGen
- newStdGen :: IO StdGen
- getRandomPrimFromStdGenIO :: Prim a -> IO a
- getRandomPrimFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> Prim a -> m a
- getRandomPrimFromRandomGenState :: forall g m a. (RandomGen g, MonadState g m) => Prim a -> m a
Documentation
The StdGen
instance of RandomGen
has a genRange
of at least 30 bits.
The result of repeatedly using next
should be at least as statistically
robust as the Minimal Standard Random Number Generator described by
[System.Random, System.Random].
Until more is known about implementations of split
, all we require is
that split
deliver generators that are (a) not identical and
(b) independently robust in the sense just given.
The Show
and Read
instances of StdGen
provide a primitive way to save the
state of a random number generator.
It is required that
.read
(show
g) == g
In addition, reads
may be used to map an arbitrary string (not necessarily one
produced by show
) onto a value of type StdGen
. In general, the Read
instance of StdGen
has the following properties:
- It guarantees to succeed on any string.
- It guarantees to consume only a finite portion of the string.
- Different argument strings are likely to result in different results.
Instances
Applies split
to the current global random generator,
updates it with one of the results, and returns the other.
getRandomPrimFromStdGenIO :: Prim a -> IO a Source #
getRandomPrimFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> Prim a -> m a Source #
Given a mutable reference to a RandomGen
generator, we can make a
RandomSource
usable in any monad in which the reference can be modified.
See Data.Random.Source.PureMT.getRandomPrimFromMTRef
for more detailed
usage hints - this function serves exactly the same purpose except for a
StdGen
generator instead of a PureMT
generator.
getRandomPrimFromRandomGenState :: forall g m a. (RandomGen g, MonadState g m) => Prim a -> m a Source #
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 RVar
s and
other Distribution
instances to "pure" random variables.
Again, see Data.Random.Source.PureMT.getRandomPrimFromMTState
for more
detailed usage hints - this function serves exactly the same purpose except
for a StdGen
generator instead of a PureMT
generator.