# 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
```