----------------------------------------------------------------------------- -- | -- Module : Numeric.Random.Distribution.Exponential -- Copyright : (c) Matthew Donadio 2003 -- License : GPL -- -- Maintainer : m.p.donadio@ieee.org -- Stability : experimental -- Portability : portable -- -- UNTESTED -- -- Module for transforming a list of uniform random variables into a -- list of exponential random variables. -- -- @ f(x) = lambda * exp(-lambda*x) @ -- -- @ F(x) = 1 - exp(-lambda*x) @ -- -- @ lambda = 1 \/ mu @ -- -- Reference: Ross -- ---------------------------------------------------------------------------- -- TODO: Marsaglia's ziggurat method module Numeric.Random.Distribution.Exponential (exponential_inv) where -- * Functions -- | Generates a list of exponential random variables from a list -- of uniforms via the inverse transformation method -- -- @ F(x) = 1 - exp(-lambda*x) @ -- -- @ F^-1(x) = -log(1 - x) \/ lambda@ exponential_inv :: Double -- ^ lambda -> [Double] -- ^ U -> [Double] -- ^ X exponential_inv :: Double -> [Double] -> [Double] exponential_inv Double lambda [Double] us = forall a b. (a -> b) -> [a] -> [b] map (\Double u -> -forall a. Floating a => a -> a log (Double 1 forall a. Num a => a -> a -> a - Double u) forall a. Fractional a => a -> a -> a / Double lambda) [Double] us