how to generate random numbers that satisfy certain distribution

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Jan 23 17:06:25 EST 2010


On Sat, 23 Jan 2010 12:29:22 -0800, Paul Rubin wrote:

> Peter Chant <peteRE at MpeteOzilla.Vco.ukE> writes:
>> I remeber being told that adding up 12 random numbers in the range 0-1
>> (which is what most computer random number genertors at the time
>> chucked out) and subtracted 6 gives a pretty good normal distribution. 
>> I think I did try it once and it failed, but I must have done something
>> odd.
> 
> That gives you a binomial distribution on 12 trials, which approximates
> a normal distribution when the number of trials is large.  12 isn't too
> bad.  But there's a simpler way, the Box-Muller transform, that gives
> you a pair drawn from a precisely normal distribution from two uniform
> random samples:
> 
>   http://en.wikipedia.org/wiki/Box-Muller_transform


The Box-Muller transform is reasonably simple, but you can't be serious 
that it is simpler than adding twelve random numbers and subtracting six!

def almost_normal():
    return sum([random.random() for _ in xrange(12)], -6)


Not that I'm recommending that anyone use this binomial approximation for 
anything but the quickest and dirtiest uses, particularly since the 
random module already has two excellent normal distributions (gauss and 
normalvariate). 



-- 
Steven



More information about the Python-list mailing list