import Prelude
+#ifdef __NHC__
+import CPUTime ( getCPUTime )
+import Foreign.Ptr ( Ptr, nullPtr )
+#else
import System.CPUTime ( getCPUTime )
+import System.Time ( getClockTime, ClockTime(..) )
+#endif
import Data.Char ( isSpace, chr, ord )
import System.IO.Unsafe ( unsafePerformIO )
import Data.IORef
import Numeric ( readDec )
-#ifdef __GLASGOW_HASKELL__
-import GHC.Show ( showSignedInt, showSpace )
-import GHC.IOBase ( unsafePerformIO, stToIO )
-import System.Time ( getClockTime, ClockTime(..) )
+-- The standard nhc98 implementation of Time.ClockTime does not match
+-- the extended one expected in this module, so we lash-up a quick
+-- replacement here.
+#ifdef __NHC__
+data ClockTime = TOD Integer ()
+foreign import ccall "time.h time" readtime :: Ptr () -> IO Int
+getClockTime :: IO ClockTime
+getClockTime = do t <- readtime nullPtr; return (TOD (toInteger t) ())
#endif
{- $intro
-The "Random" library deals with the common task of pseudo-random
+This library deals with the common task of pseudo-random
number generation. The library makes it possible to generate
repeatable results, by starting with a specified initial random
number generator; or to get different results on each run by using the
-- default mathod
genRange g = (minBound,maxBound)
-{- |The "Random" library provides one instance of 'RandomGen', the abstract data
-type 'StdGen'.
+{- |The "System.Random" library provides one instance of 'RandomGen', the
+abstract data type 'StdGen'.
The result of repeatedly using next should be at least as statistically robust
as the /Minimal Standard Random Number Generator/ described by
next = stdNext
split = stdSplit
-#ifdef __GLASGOW_HASKELL__
-instance Show StdGen where
- showsPrec p (StdGen s1 s2) =
- showSignedInt p s1 .
- showSpace .
- showSignedInt p s2
-#endif
-
-#ifdef __HUGS__
instance Show StdGen where
showsPrec p (StdGen s1 s2) =
showsPrec p s1 .
showChar ' ' .
showsPrec p s2
-#endif
instance Read StdGen where
readsPrec _p = \ r ->
-- |Default methods
randoms :: RandomGen g => g -> [a]
- randoms g = x : randoms g' where (x,g') = random g
+ randoms g = (\(x,g') -> x : randoms g') (random g)
randomRs :: RandomGen g => (a,a) -> g -> [a]
randomRs ival g = x : randomRs ival g' where (x,g') = randomR ival g
random g = randomIvalDouble (0::Double,1) realToFrac g
randomR (a,b) g = randomIvalDouble (realToFrac a, realToFrac b) realToFrac g
-#ifdef __GLASGOW_HASKELL__
mkStdRNG :: Integer -> IO StdGen
mkStdRNG o = do
ct <- getCPUTime
(TOD sec _) <- getClockTime
return (createStdGen (sec * 12345 + ct + o))
-#endif
-
-#ifdef __HUGS__
-mkStdRNG :: Integer -> IO StdGen
-mkStdRNG o = do
- ct <- getCPUTime
- return (createStdGen (ct + o))
-#endif
randomIvalInteger :: (RandomGen g, Num a) => (Integer, Integer) -> g -> (a, g)
randomIvalInteger (l,h) rng