module Stochastic.Normal(mkNormal, Normal) where
import Data.Maybe
import Stochastic.Distribution
import Stochastic.Uniform
import Helpers
data Normal = Normal Double Double (Maybe Double) Uniform
mkNormal :: Uniform -> Double -> Double -> Normal
mkNormal uni mean dev = Normal mean dev Nothing uni
toDbl :: Int -> Double
toDbl = fromInteger . toInteger
instance ContinuousDistribution Normal where
randDouble (Normal mean dev m uni) = f m
where
f (Just x) = (x, (Normal mean dev Nothing uni))
f Nothing = (y, (Normal mean dev (Just z) uni))
([u1, u2], uni') = randDoubles 2 uni
from_u g = mean + dev * (sqrt (2 * (log u1))) * ( g (2 * pi * u2) )
y = from_u (sin)
z = from_u (cos)