X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Flib%2Fstd%2FRandom.lhs;h=1f19b201bf2dbaf07796b5e4f04c5a487ba7f428;hb=239e9471e104fd88ec93bf42623c3a68a496657a;hp=4a2a88d263fe7f00bdf46bbf9a7e12672d60d87a;hpb=716d91c23d0f9a62474098d32eb6237ebe755944;p=ghc-hetmet.git diff --git a/ghc/lib/std/Random.lhs b/ghc/lib/std/Random.lhs index 4a2a88d..1f19b20 100644 --- a/ghc/lib/std/Random.lhs +++ b/ghc/lib/std/Random.lhs @@ -1,7 +1,10 @@ +% ------------------------------------------------------------------------------ +% $Id: Random.lhs,v 1.25 2001/08/29 10:49:28 simonmar Exp $ % -% (c) The GRASP/AQUA Project, Glasgow University, 1995-99 +% (c) The University of Glasgow, 1995-2000 % +\section[Random]{Module @Random@} The June 1988 (v31 #6) issue of the Communications of the ACM has an article by Pierre L'Ecuyer called, "Efficient and Portable Combined @@ -16,7 +19,7 @@ world.. \begin{code} module Random ( - RandomGen(next, split) + RandomGen(next, split, genRange) , StdGen , mkStdGen , Random ( random, randomR, @@ -30,17 +33,13 @@ module Random #ifndef __HUGS__ import PrelGHC ( RealWorld ) -import PrelNum ( fromInt ) import PrelShow ( showSignedInt, showSpace ) 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 privileged Prelude - ( IORef +import PrelPrim ( IORef , newIORef , readIORef , writeIORef @@ -54,12 +53,14 @@ import Char ( isSpace, chr, ord ) \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 @@ -114,7 +115,7 @@ mkStdGen s 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 @@ -175,17 +176,9 @@ instance Random Double where 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} @@ -217,7 +210,7 @@ randomIvalInteger (l,h) rng let (x,g') = next g in - f (n-1) (fromInt x + acc * b) g' + f (n-1) (fromIntegral x + acc * b) g' randomIvalDouble :: (RandomGen g, Fractional a) => (Double, Double) -> (Double -> a) -> g -> (a, g) randomIvalDouble (l,h) fromDouble rng