[Python-checkins] r61796 - in python/trunk: Doc/library/random.rst Lib/random.py Lib/test/test_random.py Misc/NEWS

raymond.hettinger python-checkins at python.org
Sun Mar 23 14:32:32 CET 2008


Author: raymond.hettinger
Date: Sun Mar 23 14:32:32 2008
New Revision: 61796

Modified:
   python/trunk/Doc/library/random.rst
   python/trunk/Lib/random.py
   python/trunk/Lib/test/test_random.py
   python/trunk/Misc/NEWS
Log:
Issue 1681432:  Add triangular distribution the random module.

Modified: python/trunk/Doc/library/random.rst
==============================================================================
--- python/trunk/Doc/library/random.rst	(original)
+++ python/trunk/Doc/library/random.rst	Sun Mar 23 14:32:32 2008
@@ -190,6 +190,10 @@
 
    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)
 

Modified: python/trunk/Lib/random.py
==============================================================================
--- python/trunk/Lib/random.py	(original)
+++ python/trunk/Lib/random.py	Sun Mar 23 14:32:32 2008
@@ -13,6 +13,7 @@
     distributions on the real line:
     ------------------------------
            uniform
+           triangular
            normal (Gaussian)
            lognormal
            negative exponential
@@ -47,7 +48,7 @@
 
 __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","jumpahead", "WichmannHill", "getrandbits",
            "SystemRandom"]
@@ -350,6 +351,25 @@
         """Get a random number in the range [a, b)."""
         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 --------------------
 
     def normalvariate(self, mu, sigma):
@@ -839,6 +859,7 @@
     _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
@@ -850,6 +871,7 @@
 seed = _inst.seed
 random = _inst.random
 uniform = _inst.uniform
+triangular = _inst.triangular
 randint = _inst.randint
 choice = _inst.choice
 randrange = _inst.randrange

Modified: python/trunk/Lib/test/test_random.py
==============================================================================
--- python/trunk/Lib/test/test_random.py	(original)
+++ python/trunk/Lib/test/test_random.py	Sun Mar 23 14:32:32 2008
@@ -488,6 +488,7 @@
         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.betavariate(3.0, 3.0)
+        g.random = x[:].pop; g.triangular(0.0, 1.0, 1.0/3.0)
 
     def test_avg_std(self):
         # Use integration to test distribution average and standard deviation.
@@ -497,6 +498,7 @@
         x = [i/float(N) for i in xrange(1,N)]
         for variate, args, mu, sigmasqrd in [
                 (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.paretovariate, (5.0,), 5.0/(5.0-1),
                                   5.0/((5.0-1)**2*(5.0-2))),

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sun Mar 23 14:32:32 2008
@@ -66,6 +66,8 @@
 - Issue #2432: give DictReader the dialect and line_num attributes
   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
   WWW-Authenticate header.
 


More information about the Python-checkins mailing list