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
                          

Reply via email to