module Stochastic.Distribution(ContinuousDistribution(..), DiscreteDistribution(..)) where
import Helpers(histogram, statefully)
class DiscreteDistribution g where
randInt :: g -> (Int, g)
randInt g = randIntIn (0, maxBound::Int) g
randInts :: Int -> g -> ([Int], g)
randInts n g0 = statefully (randInt) n g0
randIntIn :: (Int, Int) -> g -> (Int, g)
default randIntIn :: (ContinuousDistribution g) =>
(Int, Int) -> g -> (Int, g)
randIntIn (a, b) g0 = ((ceiling (toDbl (b a + 1) * d)) + (a1), g1)
where
(d, g1) = randDouble g0
class ContinuousDistribution g where
randDouble :: g -> (Double, g)
randDoubles :: Int -> g -> ([Double], g)
randDoubles n g0 = statefully (randDouble) n g0
toDbl = fromInteger . toInteger