Hi!
Consider this:
\begin{code}
import Random
main = do r <- randomRIO (6.0::Double,7.0::Double)
putStrLn $ "Got " ++ (show r)
getChar
main
\end{code}
The output is in the interval [6.0..7.0], as expected.
Now take
\begin{code}
import Random
main = do r <- randomRIO (6::Integer,7::Integer)
putStrLn (show r)
getChar
main
\end{code}
Output is in [0,1,2]! (because different type <-> different generator)
This is clearly not, what one expects... :-)
The cause seems to be randomIvalInteger. I didn't try to understand what
_exactly_ it does, but the following fix makes it work more like I need it.
--- Random.lhs.orig Mon Jun 7 11:13:37 1999
+++ Random.lhs Mon Jun 7 11:09:32 1999
@@ -164,7 +164,7 @@
randomIvalInteger :: (RandomGen g, Num a) => (Integer, Integer) -> g -> (a, g)
randomIvalInteger (l,h) rng
| l > h = randomIvalInteger (h,l) rng
- | otherwise = case (f n 1 rng) of (v, rng') -> (fromInteger (v `mod` (k+1)), rng')
+ | otherwise = case (f n 1 rng) of (v, rng') -> (fromInteger (l + (v `mod` k)), rng')
where
k = h - l + 1
b = 2147483561