module Stochastic.Geometric (mkGeometric, Geometric) where
import Stochastic.Distribution
import Stochastic.Uniform
import Helpers
data Geometric = Geometric Double Uniform
mkGeometric :: Uniform -> Double -> Geometric
mkGeometric base p = Geometric p base
instance DiscreteDistribution Geometric where
randIntIn (a, b) (Geometric p g0) = mapTuple
(\u -> trunc $ invert u)
(Geometric p)
(randDouble g0)
where
invert u = ceiling $ (log u) / (log (1p))
trunc x
| x > (ba) = b
| otherwise = a+x
toDbl = fromInteger . toInteger