summaryrefslogtreecommitdiff
path: root/Lib/random.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/random.py')
-rw-r--r--Lib/random.py25
1 files changed, 24 insertions, 1 deletions
diff --git a/Lib/random.py b/Lib/random.py
index 72b422f480..e0c015d8e8 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -13,6 +13,7 @@
distributions on the real line:
------------------------------
uniform
+ triangular
normal (Gaussian)
lognormal
negative exponential
@@ -35,6 +36,7 @@ General notes on the underlying Mersenne Twister core generator:
"""
+from __future__ import division
from warnings import warn as _warn
from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
@@ -44,7 +46,7 @@ from binascii import hexlify as _hexlify
__all__ = ["Random","seed","random","uniform","randint","choice","sample",
"randrange","shuffle","normalvariate","lognormvariate",
- "expovariate","vonmisesvariate","gammavariate",
+ "expovariate","vonmisesvariate","gammavariate","triangular",
"gauss","betavariate","paretovariate","weibullvariate",
"getstate","setstate", "getrandbits",
"SystemRandom"]
@@ -333,6 +335,25 @@ class Random(_random.Random):
"""Get a random number in the range [a, b)."""
return a + (b-a) * self.random()
+## -------------------- triangular --------------------
+
+ def triangular(self, low=0.0, high=1.0, mode=None):
+ """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 = 0.5 if mode is None else (mode - low) / (high - low)
+ if u > c:
+ u = 1.0 - u
+ c = 1.0 - c
+ low, high = high, low
+ return low + (high - low) * (u * c) ** 0.5
+
## -------------------- normal distribution --------------------
def normalvariate(self, mu, sigma):
@@ -671,6 +692,7 @@ def _test(N=2000):
_test_generator(N, gammavariate, (200.0, 1.0))
_test_generator(N, gauss, (0.0, 1.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
# as module-level functions. The functions share state across all uses
@@ -682,6 +704,7 @@ _inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
+triangular = _inst.triangular
randint = _inst.randint
choice = _inst.choice
randrange = _inst.randrange