/
T.hs
63 lines (52 loc) · 1.24 KB
/
T.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
module Main (main) where
import Data.List
import Data.Int
import Data.Word
import Control.Monad
import Control.Monad.ST
import Data.Time.Clock.POSIX
import Data.Array.Vector
import Statistics.RandomVariate
import System.Random.Mersenne
getTime :: IO Double
getTime = (fromRational . toRational) `fmap` getPOSIXTime
time :: IO a -> IO (Double, a)
time act = do
s <- getTime
ret <- act
e <- ret `seq` getTime
return (e-s, ret)
count = 250 * 1000000
type T = Word32
--summ :: [T] -> T
--summ = foldl' (+) 0
loop :: Monad m => Int -> m T -> m T
loop n act = go 0 0
where
go !i !s | i >= n = return s
| otherwise = do
d <- act
go (i+1) (s+d)
mwc :: Word32 -> IO T
mwc k = return $! runST go where
go = do
gen <- initialize (singletonU k)
loop count (uniform gen)
mwca :: Word32 -> IO T
mwca k = return $! runST go where
go = do
gen <- initialize (singletonU k)
sumU `fmap` uniformArray gen count
mersenne :: IO T
mersenne = do
gen <- getStdGen
loop count (random gen)
main = do
forM_ [1..3] $ \n -> do
putStr "mwc: "
print =<< time (mwc n)
putStr "mwca: "
print =<< time (mwca n)
putStr "mersenne: "
print =<< time mersenne