]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #17149: Fix random.vonmisesvariate to always return results in [0, 2*math.pi].
authorMark Dickinson <dickinsm@gmail.com>
Sun, 10 Feb 2013 14:16:10 +0000 (14:16 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 10 Feb 2013 14:16:10 +0000 (14:16 +0000)
Lib/random.py
Lib/test/test_random.py
Misc/NEWS

index 9b61208d2eb49eeebf29c1b5245152ceae68e99a..4cbe9ade43768602261efb3f8e31fd3e4d4f1a23 100644 (file)
@@ -449,9 +449,9 @@ class Random(_random.Random):
 
         u3 = random()
         if u3 > 0.5:
-            theta = (mu % TWOPI) + _acos(f)
+            theta = (mu + _acos(f)) % TWOPI
         else:
-            theta = (mu % TWOPI) - _acos(f)
+            theta = (mu - _acos(f)) % TWOPI
 
         return theta
 
index 776d0c4163e9a7bfca933105da1b99dbae57e4b9..073bed468eb93fe0ca1f4ff6391808cb3a8f12e5 100644 (file)
@@ -475,6 +475,20 @@ class TestDistributions(unittest.TestCase):
             self.assertAlmostEqual(s1/N, mu, places=2)
             self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2)
 
+    def test_von_mises_range(self):
+        # Issue 17149: von mises variates were not consistently in the
+        # range [0, 2*PI].
+        g = random.Random()
+        N = 100
+        for mu in 0.0, 0.1, 3.1, 6.2:
+            for kappa in 0.0, 2.3, 500.0:
+                for _ in range(N):
+                    sample = g.vonmisesvariate(mu, kappa)
+                    self.assertTrue(
+                        0 <= sample <= random.TWOPI,
+                        msg=("vonmisesvariate({}, {}) produced a result {} out"
+                             " of range [0, 2*pi]").format(mu, kappa, sample))
+
 class TestModule(unittest.TestCase):
     def testMagicConstants(self):
         self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141)
index e28509e80cde87d9944f48cbb771389d6e39ccbc..c4793c70d0f132497f82da7b550b9d236262c47c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -218,6 +218,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #17149: Fix random.vonmisesvariate to always return results in
+  [0, 2*math.pi].
+
 - Issue #1470548: XMLGenerator now works with binary output streams.
 
 - Issue #6975: os.path.realpath() now correctly resolves multiple nested