-----------------------------------------------------------------------------
-- |
-- Module      :  Numeric.Random.Distribution.Binomial
-- 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 binomial random variables.
--
-- Reference: Ross
--
----------------------------------------------------------------------------

module Numeric.Random.Distribution.Binomial (binomial) where

-- * Functions

-- | Generates a list of binomial random variables from a list
-- of uniforms

binomial :: Int       -- ^ n
	 -> Double    -- ^ p
	 -> [Double]  -- ^ U
	 -> [Double]  -- ^ X

binomial :: Int -> Double -> [Double] -> [Double]
binomial Int
n Double
p [Double]
us = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Double]
xi forall a. a -> [a] -> [a]
: Int -> Double -> [Double] -> [Double]
binomial Int
n Double
p (forall a. Int -> [a] -> [a]
drop Int
n [Double]
us)
    where xi :: [Double]
xi = forall a b. (a -> b) -> [a] -> [b]
map (\Double
u -> if Double
u forall a. Ord a => a -> a -> Bool
< Double
p then Double
1 else Double
0) (forall a. Int -> [a] -> [a]
take Int
n [Double]
us)