hquantlib-0.0.4.0: src/QuantLib/Stochastic/PureMT.hs
module QuantLib.Stochastic.PureMT
(
PureMT
, newPureMT
, randomDouble
, splitMT
, splitMTwithSeed
) where
import Data.Time.Calendar
import Data.Time.Clock
import System.CPUTime
import qualified System.Random.Mersenne.Pure64 as P
data PureMT = PureMT P.PureMT Integer
newPureMT :: IO PureMT
newPureMT = do
ct <- getCPUTime
t <- getCurrentTime
let seed = toModifiedJulianDay (utctDay t) + diffTimeToPicoseconds (utctDayTime t) + ct
return $ PureMT (P.pureMT $ fromIntegral seed) seed
randomDouble:: PureMT -> (Double, PureMT)
randomDouble (PureMT mt seed) = (r, PureMT newMt seed)
where
(r, newMt) = P.randomDouble mt
splitMT :: PureMT -> (PureMT, PureMT)
splitMT = splitMTwithSeed 1
splitMTwithSeed :: Integer -> PureMT -> (PureMT, PureMT)
splitMTwithSeed addedSeed mt@(PureMT _ seed) = (mt, PureMT newMt newSeed)
where
newSeed = seed + addedSeed
newMt = P.pureMT $ fromIntegral newSeed