added normalDistrib and randUint31

This commit is contained in:
Darren Ranalli 2004-06-03 20:27:36 +00:00
parent 2021f560b2
commit 3c8c38a78d

View File

@ -864,3 +864,36 @@ def weightedChoice(choiceList, rng=random.random, sum=None):
def randFloat(a, b, rng=random.random): def randFloat(a, b, rng=random.random):
"""returns a random float in [a,b]""" """returns a random float in [a,b]"""
return lerp(a,b,rng()) return lerp(a,b,rng())
def normalDistrib(a, b, gauss=random.gauss):
"""
NOTE: assumes a < b
Returns random number between a and b, using gaussian distribution, with
mean=avg(a,b), and a standard deviation that fits ~99.7% of the curve
between a and b. Outlying results are clipped to a and b.
------------------------------------------------------------------------
http://www-stat.stanford.edu/~naras/jsm/NormalDensity/NormalDensity.html
The 68-95-99.7% Rule
====================
All normal density curves satisfy the following property which is often
referred to as the Empirical Rule:
68% of the observations fall within 1 standard deviation of the mean.
95% of the observations fall within 2 standard deviations of the mean.
99.7% of the observations fall within 3 standard deviations of the mean.
Thus, for a normal distribution, almost all values lie within 3 standard
deviations of the mean.
------------------------------------------------------------------------
In calculating our standard deviation, we divide (b-a) by 6, since the
99.7% figure includes 3 standard deviations _on_either_side_ of the mean.
"""
return min(a, max(b, gauss((a+b)*.5, (b-a)/6.)))
def randUint31(rng=random.random):
"""returns a random integer in [0..2^31).
rng must return float in [0..1]"""
return int(rng() * 0x7FFFFFFF)