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 (1-p)) trunc x | x > (b-a) = b | otherwise = a+x toDbl = fromInteger . toInteger