
G'day. On Wed, May 07, 2003 at 11:18:01AM -0400, Matthew Donadio wrote:
1. Should the functions generate the necessary uniforms, or accept a list of uniforms? In other words, shuld the signature be
wgn :: Int -- ^ seed to generate the uniforms -> [Double] -- ^ list of Gaussian random variables
or
wgn :: [Double] -- ^ list of uniform random variables -> [Double] -- ^ list of Gaussian random variables
IMO, the first is unacceptable because I may want to plug in my own random numbers. In addition, I may not want to seed my random number generator from a simple Int (e.g. if I need cryptographically strong Gaussian random numbers; no idea why, of course). OTOH, if you're using the algorithm I'm thinking of, wgn turns two uniform random numbers into two Gaussian random numbers. The type declaration above suggests that if I give you an odd number of uniform random variables, I'll get the same number of Gaussian random variables. Speaking as someone who uses random numbers regularly, though, what I want to do is not plug in random numbers, but rather plug in a random number generator. Something like this perhaps: class (Monad m) => RNG rng m | rng -> m where getUniformRand :: rng -> m Double wgn :: (Monad m, RNG rng m) => rng -> m [Double]
2. Should the functions accept mean and/or variance parameters, or should they generate unit normals?
Is there a reason not to provide both? Cheers, Andrew Bromage