mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #17141: random.vonmisesvariate() no more hangs for large kappas.
This commit is contained in:
commit
06e5e730dd
3 changed files with 40 additions and 10 deletions
|
@ -432,22 +432,20 @@ class Random(_random.Random):
|
|||
if kappa <= 1e-6:
|
||||
return TWOPI * random()
|
||||
|
||||
a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa)
|
||||
b = (a - _sqrt(2.0 * a))/(2.0 * kappa)
|
||||
r = (1.0 + b * b)/(2.0 * b)
|
||||
s = 0.5 / kappa
|
||||
r = s + _sqrt(1.0 + s * s)
|
||||
|
||||
while 1:
|
||||
u1 = random()
|
||||
|
||||
z = _cos(_pi * u1)
|
||||
f = (1.0 + r * z)/(r + z)
|
||||
c = kappa * (r - f)
|
||||
|
||||
d = z / (r + z)
|
||||
u2 = random()
|
||||
|
||||
if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c):
|
||||
if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
|
||||
break
|
||||
|
||||
q = 1.0 / r
|
||||
f = (q + z) / (1.0 + q * z)
|
||||
u3 = random()
|
||||
if u3 > 0.5:
|
||||
theta = (mu + _acos(f)) % TWOPI
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue