Copyright | (c) 2012-2013 Michał Pałka |
---|---|
License | BSD3 |
Maintainer | michal.palka@chalmers.se |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell98 |
Documentation
The generator type
class RandomGen g where Source #
Alternative RandomGen
class with a modified next
operation, and added splitn
and level
operations.
Using the generator requires that no more than one operation is called
on the same generator state, as the implementation does not guarantee pseudorandomness
otherwise. As an exception, calling splitn
many times on the same generator state is
allowed as long as the 'bits' argument is the same for all the calls.
next :: g -> (Word32, g) Source #
next
returns a Word32
that appears to have been chosen uniformly at random, and a
new generator state.
split
returns two derived generator states that appear to be independent pseudorandom
number generators.
:: g | Original generator state. |
-> Int | Number of bits that will be used to index the derived states. Must be between 0 and 32. |
-> Word32 | Index of the derived state. Call to |
-> g |
splitn
is the n-way split operation used to create many derived generator states
in one go. Application of splitn
to two first arguments should be shared between
different applications of the index argument to avoid unnecessary repeated computations.
The following code creates ten 'independent' generator states. Number '4' comes from the fact that at least four bits are needed to encode ten different indices.
f :: RandomGen g => g -> [g] f r = map (splitn r 4) [0..9]
level
is a 'hint' operation that may cause an iteration of work
of the generator be performed prematurely in order to
prevent the subsequent operations from being expensive. It is meant to be
called before a splitn
operation, which is expected to be evaluated
a very large number indices. Calling level
in such case might decrease
the total amount of work performed.