Sat Feb 18 13:39:19 EST 2012
Forking a random number generator?
For an animation framework I need random numbers in the "leaf nodes"
of an animation tree. However, I don't want to introduce a serial
dependency over the tree, i.e. through a state monad to track RNG
Is it possible to "split" an RNG such that it has a tree-like (Reader
monad / S-combinator) dependency graph, while keeping the sequences
generated in the leaf nodes of this tree "random enough".
There is a random number generator that is seeded by integers:
mkStdGen :: Int -> StdGen
so maybe the question is: how to fork integers? Or, how to fork them
enough such that collisions are rare?
A very un-informed way would be to just multiply the seed by a prime
number. This will not reduce the configuration space and give a
reasonable "decorrelation" if the prime number is large enough?
The funny thing is that the decorrelation itself will be simpler to
express as a serial operation when forking a random number of states.
To parallellize this again a list of primes could be used..
Then when lists of primes arrive, it's probably also possible to just
use binary trees: shift by one and fork +0, +1 though that seems to
run out of states faster.