@@ -445,14 +445,15 @@ def vonmisesvariate(self, mu, kappa):
445445## -------------------- gamma distribution --------------------
446446
447447 def gammavariate (self , alpha , beta ):
448- # beta times standard gamma
449- return beta * self .stdgamma (alpha )
450-
451- def stdgamma (self , alpha , * args ): # *args for Py2.2 compatiblity
448+
449+ # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
450+
451+ # Warning: a few older sources define the gamma distribution in terms
452+ # of alpha > -1.0
453+ if alpha <= 0.0 or beta <= 0.0 :
454+ raise ValueError , 'gammavariate: alpha and beta must be > 0.0'
455+
452456 random = self .random
453- if alpha <= 0.0 :
454- raise ValueError , 'stdgamma: alpha must be > 0.0'
455-
456457 if alpha > 1.0 :
457458
458459 # Uses R.C.H. Cheng, "The generation of Gamma
@@ -471,14 +472,14 @@ def stdgamma(self, alpha, *args): # *args for Py2.2 compatiblity
471472 z = u1 * u1 * u2
472473 r = bbb + ccc * v - x
473474 if r + SG_MAGICCONST - 4.5 * z >= 0.0 or r >= _log (z ):
474- return x
475+ return x * beta
475476
476477 elif alpha == 1.0 :
477478 # expovariate(1)
478479 u = random ()
479480 while u <= 1e-7 :
480481 u = random ()
481- return - _log (u )
482+ return - _log (u ) * beta
482483
483484 else : # alpha is between 0 and 1 (exclusive)
484485
@@ -497,7 +498,27 @@ def stdgamma(self, alpha, *args): # *args for Py2.2 compatiblity
497498 if not (((p <= 1.0 ) and (u1 > _exp (- x ))) or
498499 ((p > 1 ) and (u1 > pow (x , alpha - 1.0 )))):
499500 break
500- return x
501+ return x * beta
502+
503+
504+ def stdgamma (self , alpha , ainv , bbb , ccc ):
505+ # This method was (and shall remain) undocumented.
506+ # This method is deprecated
507+ # for the following reasons:
508+ # 1. Returns same as .gammavariate(alpha, 1.0)
509+ # 2. Requires caller to provide 3 extra arguments
510+ # that are functions of alpha anyway
511+ # 3. Can't be used for alpha < 0.5
512+
513+ # ainv = sqrt(2 * alpha - 1)
514+ # bbb = alpha - log(4)
515+ # ccc = alpha + ainv
516+ import warnings
517+ warnings .warn ("The stdgamma function is deprecated; "
518+ "use gammavariate() instead" ,
519+ DeprecationWarning )
520+ return self .gammavariate (alpha , 1.0 )
521+
501522
502523
503524## -------------------- Gauss (faster alternative) --------------------
@@ -596,7 +617,7 @@ def _test_generator(n, funccall):
596617 print 'avg %g, stddev %g, min %g, max %g' % \
597618 (avg , stddev , smallest , largest )
598619
599- def _test (N = 200 ):
620+ def _test (N = 20000 ):
600621 print 'TWOPI =' , TWOPI
601622 print 'LOG4 =' , LOG4
602623 print 'NV_MAGICCONST =' , NV_MAGICCONST
@@ -607,6 +628,9 @@ def _test(N=200):
607628 _test_generator (N , 'cunifvariate(0.0, 1.0)' )
608629 _test_generator (N , 'expovariate(1.0)' )
609630 _test_generator (N , 'vonmisesvariate(0.0, 1.0)' )
631+ _test_generator (N , 'gammavariate(0.01, 1.0)' )
632+ _test_generator (N , 'gammavariate(0.1, 1.0)' )
633+ _test_generator (N , 'gammavariate(0.1, 2.0)' )
610634 _test_generator (N , 'gammavariate(0.5, 1.0)' )
611635 _test_generator (N , 'gammavariate(0.9, 1.0)' )
612636 _test_generator (N , 'gammavariate(1.0, 1.0)' )
0 commit comments