diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2013-04-12 20:27:37 (GMT) |
---|---|---|
committer | Andrew Svetlov <andrew.svetlov@gmail.com> | 2013-04-12 20:27:37 (GMT) |
commit | 730001163f1bd7469c17743e1846cf2761639191 (patch) | |
tree | 2a566bd9998cc2fc632b40fb84bb47af8c721efe | |
parent | 3042b5ebf4aee83957428870b86de394646b731c (diff) | |
parent | a2dfc35a1341fc73a074cda9190bb99a821f8095 (diff) | |
download | cpython-730001163f1bd7469c17743e1846cf2761639191.zip cpython-730001163f1bd7469c17743e1846cf2761639191.tar.gz cpython-730001163f1bd7469c17743e1846cf2761639191.tar.bz2 |
Issue #13355: Raise ValueError on random.triangular call with invalid params.
Initial patch by Yuriy Senko.
-rw-r--r-- | Lib/random.py | 10 | ||||
-rw-r--r-- | Lib/test/test_random.py | 30 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 42 insertions, 2 deletions
diff --git a/Lib/random.py b/Lib/random.py index b183f56..2fa9887 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -345,6 +345,16 @@ class Random(_random.Random): http://en.wikipedia.org/wiki/Triangular_distribution """ + # Sanity check. According to the doc low must be less or equal to + # high. And mode should be somewhere between these bounds. + if low > high: + raise ValueError('high cannot be less then low.') + if mode is not None and (mode < low or mode > high): + raise ValueError('mode must be between low and high.') + + if high == low: + return low + u = self.random() c = 0.5 if mode is None else (mode - low) / (high - low) if u > c: diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index ed5a48a..84f81ee 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -48,6 +48,33 @@ class TestBasicOps(unittest.TestCase): self.assertRaises(TypeError, self.gen.seed, 1, 2, 3, 4) self.assertRaises(TypeError, type(self.gen), []) + def test_triangular(self): + # Check that triangular() correctly handles bad input. See issue 13355. + # mode > high. + with self.assertRaises(ValueError): + random.triangular(mode=2) + with self.assertRaises(ValueError): + random.triangular(low=1, high=10, mode=11) + with self.assertRaises(ValueError): + random.triangular(low=1, high=1, mode=11) + # mode < low. + with self.assertRaises(ValueError): + random.triangular(mode=-1) + with self.assertRaises(ValueError): + random.triangular(low=1, high=10, mode=0) + with self.assertRaises(ValueError): + random.triangular(low=1, high=1, mode=0) + # low > high + with self.assertRaises(ValueError): + random.triangular(low=5, high=2) + with self.assertRaises(ValueError): + random.triangular(low=5, high=2, mode=1) + with self.assertRaises(ValueError): + random.triangular(low=-2, high=-5) + + self.assertEqual(random.triangular(low=10, high=10), 10) + self.assertEqual(random.triangular(low=10, high=10, mode=10), 10) + @unittest.mock.patch('random._urandom') # os.urandom def test_seed_when_randomness_source_not_found(self, urandom_mock): # Random.seed() uses time.time() when an operating system specific @@ -73,7 +100,6 @@ class TestBasicOps(unittest.TestCase): for (seq, shuffled_seq) in zip(seqs, shuffled_seqs): self.assertEqual(len(seq), len(shuffled_seq)) self.assertEqual(set(seq), set(shuffled_seq)) - # The above tests all would pass if the shuffle was a # no-op. The following non-deterministic test covers that. It # asserts that the shuffled sequence of 1000 distinct elements @@ -597,7 +623,7 @@ class TestDistributions(unittest.TestCase): for variate, args, expected in [ (g.uniform, (10.0, 10.0), 10.0), (g.triangular, (10.0, 10.0), 10.0), - #(g.triangular, (10.0, 10.0, 10.0), 10.0), + (g.triangular, (10.0, 10.0, 10.0), 10.0), (g.expovariate, (float('inf'),), 0.0), (g.vonmisesvariate, (3.0, float('inf')), 3.0), (g.gauss, (10.0, 0.0), 10.0), @@ -1110,6 +1110,7 @@ Nick Seidenman Žiga Seilnacht Yury Selivanov Fred Sells +Yuriy Senko Jiwon Seo Iñigo Serna Joakim Sernbrant @@ -34,6 +34,9 @@ Core and Builtins Library ------- +- Issue #13355: Raise ValueError on random.triangular call with invalid params. + Initial patch by Yuriy Senko. + - Issue #16658: add missing return to HTTPConnection.send() Patch by Jeff Knupp. |