diff -r eb0370d4686c Lib/random.py --- a/Lib/random.py Thu Feb 07 16:26:55 2013 +0200 +++ b/Lib/random.py Sun Feb 10 12:33:15 2013 +0000 @@ -450,9 +450,9 @@ 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 diff -r eb0370d4686c Lib/test/test_random.py --- a/Lib/test/test_random.py Thu Feb 07 16:26:55 2013 +0200 +++ b/Lib/test/test_random.py Sun Feb 10 12:33:15 2013 +0000 @@ -512,6 +512,18 @@ 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: + samples = [g.vonmisesvariate(mu, kappa) for _ in range(N)] + self.assertTrue( + all(0 <= sample <= random.TWOPI for sample in samples) + ) + class TestModule(unittest.TestCase): def testMagicConstants(self): self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141)