On Wed, Oct 7, 2009 at 1:59 PM, Michael Mossey <mpm@alumni.caltech.edu> wrote:
My thread about randomness got hijacked so I need to restate my remaining question here. Is it acceptable to write pure routines that use but do not return generators, and then call several of them from an IO monad with a generator obtained by several calls to newStdGen?

shuffle :: RandomGen g => g -> [a] -> [a]
shuffle = ...

foo :: [a] -> [a] -> IO ()
foo xs ys = do
 g1 <- newStdGen
 print $ shuffle g1 xs
 g2 <- newStdGen
 print $ shuffle g2 ys

Does this kind of thing exhibit good pseudorandomness?

If you believe in the safety of the split operation (which I don't), then yes, since use of it is what's happening behind the scenes. In other words, provided you're a faithful sort and split doesn't make you squirm too much, you don't need to plug all that ugly IO in there.