random-fu-0.2: src/Data/Random/Distribution/Rayleigh.hs
{-# LANGUAGE
MultiParamTypeClasses,
FlexibleInstances, FlexibleContexts,
UndecidableInstances
#-}
module Data.Random.Distribution.Rayleigh where
import Data.Random.RVar
import Data.Random.Distribution
import Data.Random.Distribution.Uniform
floatingRayleigh :: (Floating a, Distribution StdUniform a) => a -> RVarT m a
floatingRayleigh s = do
u <- stdUniformPosT
return (s * sqrt (-2 * log u))
-- |The rayleigh distribution with a specified mode (\"sigma\") parameter.
-- Its mean will be @sigma*sqrt(pi/2)@ and its variance will be @sigma^2*(4-pi)/2@
--
-- (therefore if you want one with a particular mean @m@, @sigma@ should be @m*sqrt(2/pi)@)
newtype Rayleigh a = Rayleigh a
rayleigh :: Distribution Rayleigh a => a -> RVar a
rayleigh = rvar . Rayleigh
rayleighT :: Distribution Rayleigh a => a -> RVarT m a
rayleighT = rvarT . Rayleigh
rayleighCDF :: Real a => a -> a -> Double
rayleighCDF s x = 1 - exp ((-0.5)* realToFrac (x*x) / realToFrac (s*s))
instance (RealFloat a, Distribution StdUniform a) => Distribution Rayleigh a where
rvarT (Rayleigh s) = floatingRayleigh s
instance (Real a, Distribution Rayleigh a) => CDF Rayleigh a where
cdf (Rayleigh s) x = rayleighCDF s x