On Sat, Jan 13, 2007 at 01:49:36PM +1000, Matthew Brecknell wrote: > > 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. > > 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.
As a workaround for these problems you can create a separate RandomVar for each "atomically" block. Best regards Tomasz _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe