Issue 1681432: Add triangular distribution the random module.
This commit is contained in:
parent
9a0d3462fc
commit
bbc50eafe5
|
@ -190,6 +190,10 @@ be found in any statistics text.
|
||||||
|
|
||||||
Return a random floating point number *N* such that ``a <= N < b``.
|
Return a random floating point number *N* such that ``a <= N < b``.
|
||||||
|
|
||||||
|
.. function:: triangular(low, high, mode)
|
||||||
|
|
||||||
|
Return a random floating point number *N* such that ``low <= N < high``
|
||||||
|
and with the specified *mode* between those bounds.
|
||||||
|
|
||||||
.. function:: betavariate(alpha, beta)
|
.. function:: betavariate(alpha, beta)
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
distributions on the real line:
|
distributions on the real line:
|
||||||
------------------------------
|
------------------------------
|
||||||
uniform
|
uniform
|
||||||
|
triangular
|
||||||
normal (Gaussian)
|
normal (Gaussian)
|
||||||
lognormal
|
lognormal
|
||||||
negative exponential
|
negative exponential
|
||||||
|
@ -47,7 +48,7 @@ from binascii import hexlify as _hexlify
|
||||||
|
|
||||||
__all__ = ["Random","seed","random","uniform","randint","choice","sample",
|
__all__ = ["Random","seed","random","uniform","randint","choice","sample",
|
||||||
"randrange","shuffle","normalvariate","lognormvariate",
|
"randrange","shuffle","normalvariate","lognormvariate",
|
||||||
"expovariate","vonmisesvariate","gammavariate",
|
"expovariate","vonmisesvariate","gammavariate","triangular",
|
||||||
"gauss","betavariate","paretovariate","weibullvariate",
|
"gauss","betavariate","paretovariate","weibullvariate",
|
||||||
"getstate","setstate","jumpahead", "WichmannHill", "getrandbits",
|
"getstate","setstate","jumpahead", "WichmannHill", "getrandbits",
|
||||||
"SystemRandom"]
|
"SystemRandom"]
|
||||||
|
@ -350,6 +351,25 @@ class Random(_random.Random):
|
||||||
"""Get a random number in the range [a, b)."""
|
"""Get a random number in the range [a, b)."""
|
||||||
return a + (b-a) * self.random()
|
return a + (b-a) * self.random()
|
||||||
|
|
||||||
|
## -------------------- triangular --------------------
|
||||||
|
|
||||||
|
def triangular(self, low, high, mode):
|
||||||
|
"""Triangular distribution.
|
||||||
|
|
||||||
|
Continuous distribution bounded by given lower and upper limits,
|
||||||
|
and having a given mode value in-between.
|
||||||
|
|
||||||
|
http://en.wikipedia.org/wiki/Triangular_distribution
|
||||||
|
|
||||||
|
"""
|
||||||
|
u = self.random()
|
||||||
|
c = (mode - low) / (high - low)
|
||||||
|
if u > c:
|
||||||
|
u = 1 - u
|
||||||
|
c = 1 - c
|
||||||
|
low, high = high, low
|
||||||
|
return low + (high - low) * (u * c) ** 0.5
|
||||||
|
|
||||||
## -------------------- normal distribution --------------------
|
## -------------------- normal distribution --------------------
|
||||||
|
|
||||||
def normalvariate(self, mu, sigma):
|
def normalvariate(self, mu, sigma):
|
||||||
|
@ -839,6 +859,7 @@ def _test(N=2000):
|
||||||
_test_generator(N, gammavariate, (200.0, 1.0))
|
_test_generator(N, gammavariate, (200.0, 1.0))
|
||||||
_test_generator(N, gauss, (0.0, 1.0))
|
_test_generator(N, gauss, (0.0, 1.0))
|
||||||
_test_generator(N, betavariate, (3.0, 3.0))
|
_test_generator(N, betavariate, (3.0, 3.0))
|
||||||
|
_test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
|
||||||
|
|
||||||
# Create one instance, seeded from current time, and export its methods
|
# Create one instance, seeded from current time, and export its methods
|
||||||
# as module-level functions. The functions share state across all uses
|
# as module-level functions. The functions share state across all uses
|
||||||
|
@ -850,6 +871,7 @@ _inst = Random()
|
||||||
seed = _inst.seed
|
seed = _inst.seed
|
||||||
random = _inst.random
|
random = _inst.random
|
||||||
uniform = _inst.uniform
|
uniform = _inst.uniform
|
||||||
|
triangular = _inst.triangular
|
||||||
randint = _inst.randint
|
randint = _inst.randint
|
||||||
choice = _inst.choice
|
choice = _inst.choice
|
||||||
randrange = _inst.randrange
|
randrange = _inst.randrange
|
||||||
|
|
|
@ -488,6 +488,7 @@ class TestDistributions(unittest.TestCase):
|
||||||
g.random = x[:].pop; g.gammavariate(1.0, 1.0)
|
g.random = x[:].pop; g.gammavariate(1.0, 1.0)
|
||||||
g.random = x[:].pop; g.gammavariate(200.0, 1.0)
|
g.random = x[:].pop; g.gammavariate(200.0, 1.0)
|
||||||
g.random = x[:].pop; g.betavariate(3.0, 3.0)
|
g.random = x[:].pop; g.betavariate(3.0, 3.0)
|
||||||
|
g.random = x[:].pop; g.triangular(0.0, 1.0, 1.0/3.0)
|
||||||
|
|
||||||
def test_avg_std(self):
|
def test_avg_std(self):
|
||||||
# Use integration to test distribution average and standard deviation.
|
# Use integration to test distribution average and standard deviation.
|
||||||
|
@ -497,6 +498,7 @@ class TestDistributions(unittest.TestCase):
|
||||||
x = [i/float(N) for i in xrange(1,N)]
|
x = [i/float(N) for i in xrange(1,N)]
|
||||||
for variate, args, mu, sigmasqrd in [
|
for variate, args, mu, sigmasqrd in [
|
||||||
(g.uniform, (1.0,10.0), (10.0+1.0)/2, (10.0-1.0)**2/12),
|
(g.uniform, (1.0,10.0), (10.0+1.0)/2, (10.0-1.0)**2/12),
|
||||||
|
(g.triangular, (0.0, 1.0, 1.0/3.0), 4.0/9.0, 7.0/9.0/18.0),
|
||||||
(g.expovariate, (1.5,), 1/1.5, 1/1.5**2),
|
(g.expovariate, (1.5,), 1/1.5, 1/1.5**2),
|
||||||
(g.paretovariate, (5.0,), 5.0/(5.0-1),
|
(g.paretovariate, (5.0,), 5.0/(5.0-1),
|
||||||
5.0/((5.0-1)**2*(5.0-2))),
|
5.0/((5.0-1)**2*(5.0-2))),
|
||||||
|
|
|
@ -66,6 +66,8 @@ Library
|
||||||
- Issue #2432: give DictReader the dialect and line_num attributes
|
- Issue #2432: give DictReader the dialect and line_num attributes
|
||||||
advertised in the docs.
|
advertised in the docs.
|
||||||
|
|
||||||
|
- Issue #1681432: Add triangular distribution to the random module
|
||||||
|
|
||||||
- Issue #2136: urllib2's auth handler now allows single-quoted realms in the
|
- Issue #2136: urllib2's auth handler now allows single-quoted realms in the
|
||||||
WWW-Authenticate header.
|
WWW-Authenticate header.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue