% ------------------------------------------------------------------------------
-% $Id: Random.lhs,v 1.22 2001/02/22 13:17:59 simonpj Exp $
+% $Id: Random.lhs,v 1.25 2001/08/29 10:49:28 simonmar Exp $
%
% (c) The University of Glasgow, 1995-2000
%
\begin{code}
module Random
(
- RandomGen(next, split)
+ RandomGen(next, split, genRange)
, StdGen
, mkStdGen
, Random ( random, randomR,
import PrelRead ( readDec )
import PrelIOBase ( unsafePerformIO, stToIO )
import PrelArr ( STRef, newSTRef, readSTRef, writeSTRef )
-import PrelReal ( toInt )
-import PrelFloat ( float2Double, double2Float )
import Time ( getClockTime, ClockTime(..) )
#else
import PrelPrim ( IORef
\begin{code}
class RandomGen g where
- next :: g -> (Int, g)
- split :: g -> (g, g)
+ next :: g -> (Int, g)
+ split :: g -> (g, g)
+ genRange :: g -> (Int,Int)
+
+ -- default mathod
+ genRange g = (minBound,maxBound)
-\end{code}
-\begin{code}
data StdGen
= StdGen Int Int
createStdGen :: Integer -> StdGen
createStdGen s
| s < 0 = createStdGen (-s)
- | otherwise = StdGen (toInt (s1+1)) (toInt (s2+1))
+ | otherwise = StdGen (fromInteger (s1+1)) (fromInteger (s2+1))
where
(q, s1) = s `divMod` 2147483562
s2 = q `mod` 2147483398
random g = randomR (0::Double,1) g
-- hah, so you thought you were saving cycles by using Float?
-
-#ifdef __HUGS__
instance Random Float where
random g = randomIvalDouble (0::Double,1) realToFrac g
randomR (a,b) g = randomIvalDouble (realToFrac a, realToFrac b) realToFrac g
-#else
-instance Random Float where
- randomR (a,b) g = randomIvalDouble (float2Double a, float2Double b) double2Float g
- random g = randomIvalDouble (0::Double,1) double2Float g
-#endif
-
\end{code}