split (was Re: [Haskell-cafe] Simple program. Simple problem?)

Reid Barton rwbarton at math.harvard.edu
Sun Oct 11 20:17:48 EDT 2009


It seems that the definition of split in System.Random is not really
satisfactory.  Imagine a tree-like computation of the form

f gen = {- some expression using b, g1, g2 -}
  where b = fst (random gen) :: Bool
  	(gen1, gen2) = split gen
	g1 = f gen1
	g2 = f gen2

Let's look at the first 30 values of b produced along the right side
of the tree:

GHCi> length $ nub [ take 30 . map (fst . random) . iterate (snd . split) $ mkStdGen i :: [Bool] | i <- take 10000 . randoms $ mkStdGen 0 ]
10000

Great, we tried 10000 different initial gens and got 10000 different
sequences.  Now let's look at the left side:

GHCi> length $ nub [ take 30 . map (fst . random) . iterate (fst . split) $ mkStdGen i :: [Bool] | i <- take 10000 . randoms $ mkStdGen 0 ]
8

This doesn't seem good.

Michael's code (below) is effectively doing iterate (fst . split).

Regards,
Reid Barton

On Sun, Oct 11, 2009 at 04:24:55PM -0700, michael rice wrote:
> main = do
>   gen <- getStdGen
>   coinToss gen
>   gen <- newStdGen
>   main


More information about the Haskell-Cafe mailing list