[Haskell-cafe] STM and random numbers

Matthew Brecknell haskell at brecknell.org
Fri Jan 12 22:49:36 EST 2007

> Rather than having a separate thread computing the random numbers
> using IO, why not just stick an StdGen in a TVar and write a function
> like:
> type RandomVar = TVar StdGen
> rnd :: RandomVar -> STM a
> rnd var = do
>  g <- readTVar var
>  let (r,g') = random g
>  writeTVar var g'
>  return r

The user of this approach should be aware that it may lead to
non-determinism. That is, the sequence of psuedo-random numbers
extracted by any one thread will depend on those extracted by other
threads, which may in turn depend on the scheduling of those threads.

While non-determinism might be ideal for some applications of
psuedo-random numbers, there are other applications (simulation, in
particular) where it is useful to be able to reproduce an exact sequence
of psuedo-random events by just reapplying the same initial seed. To do
that, you would need (among other things) to thread a separate
pseudo-random generator through each thread (using the approach
described by Robert and Henning), and split the psuedo-random generator
whenever forking a new thread.

The TVar approach might also lead to excessive STM transaction
abort-retry cycles, if multiple threads are retrieving many
pseudo-random numbers via a single TVar.

More information about the Haskell-Cafe mailing list