#3620: The seeds generated by split are not independent
-----------------------------+----------------------------------------------
Reporter: NickSmallbone | Owner:
Type: bug | Status: new
Priority: normal | Component: libraries/random
Version: 6.11 | Severity: normal
Keywords: | Testcase:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
-----------------------------+----------------------------------------------
Suppose we split a seed into two like this:
{{{
split' :: StdGen -> (StdGen, StdGen)
split' g = (g12, g21)
where (_, g12) = split g1
(g21, _) = split g2
(g1, g2) = split g
}}}
Since g1 and g2 are independent, g12 and g21 ought to be too. But they're
not! If we use both of g12 and g21 to generate a random number in the
range [0..10], then the two numbers ought to be equal 1/11 of the time. In
fact, they're never equal.
Here is a test program that ought to return True 1/11 of the time but
actually always returns False:
{{{
sample :: StdGen -> (Int, Int)
sample g = (fst (randomR (0, 10) g1),
fst (randomR (0, 10) g2))
where (g1, g2) = split' g
test :: StdGen -> Bool
test g = fst (sample g) == snd (sample g)
}}}
I attached a program that prints the distribution of values from
{{{test}}} for other ranges than [0..10]. The distribution is
always quite bad no matter what the range is.
The upshot of all this is that the following QuickCheck (version 2)
property always passes, even though it's false:
{{{
import Test.QuickCheck
import Text.Show.Functions
newtype Eleven = Eleven Int deriving Eq
instance Arbitrary Eleven where
arbitrary = fmap Eleven (choose (0, 10))
prop :: (Int -> Eleven) -> Bool
prop f = f 5 /= f 6
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3620>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs