def stdgamma(self, alpha, ainv, bbb, ccc): # ainv = sqrt(2 * alpha - 1) # bbb = alpha - log(4) # ccc = alpha + ainv random = self.random if alpha <= 0.0: raise ValueError, 'stdgamma: alpha must be > 0.0' if alpha > 1.0: # Uses R.C.H. Cheng, "The generation of Gamma # variables with non-integral shape parameters", # Applied Statistics, (1977), 26, No. 1, p71-74 while 1: u1 = random() u2 = random() v = _log(u1/(1.0-u1))/ainv x = alpha*_exp(v) z = u1*u1*u2 r = bbb+ccc*v-x if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): return x elif alpha == 1.0: # expovariate(1) u = random() while u <= 1e-7: u = random() return -_log(u) else: # alpha is between 0 and 1 (exclusive) # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle while 1: u = random() b = (_e + alpha)/_e p = b*u if p <= 1.0: x = pow(p, 1.0/alpha) else: # p > 1 x = -_log((b-p)/alpha) u1 = random() if not (((p <= 1.0) and (u1 > _exp(-x))) or ((p > 1) and (u1 > pow(x, alpha - 1.0)))): break return x
def stdgamma(self, alpha, ainv, bbb, ccc): # ainv = sqrt(2 * alpha - 1) # bbb = alpha - log(4) # ccc = alpha + ainv random = self.random if alpha <= 0.0: raise ValueError, 'stdgamma: alpha must be > 0.0' if alpha > 1.0: # Uses R.C.H. Cheng, "The generation of Gamma # variables with non-integral shape parameters", # Applied Statistics, (1977), 26, No. 1, p71-74 while 1: u1 = random() u2 = random() v = _log(u1 / (1.0 - u1)) / ainv x = alpha * _exp(v) z = u1 * u1 * u2 r = bbb + ccc * v - x if r + SG_MAGICCONST - 4.5 * z >= 0.0 or r >= _log(z): return x elif alpha == 1.0: # expovariate(1) u = random() while u <= 1e-7: u = random() return -_log(u) else: # alpha is between 0 and 1 (exclusive) # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle while 1: u = random() b = (_e + alpha) / _e p = b * u if p <= 1.0: x = pow(p, 1.0 / alpha) else: # p > 1 x = -_log((b - p) / alpha) u1 = random() if not (((p <= 1.0) and (u1 > _exp(-x))) or ((p > 1) and (u1 > pow(x, alpha - 1.0)))): break return x
def vonmisesvariate(self, mu, kappa): # mu: mean angle (in radians between 0 and 2*pi) # kappa: concentration parameter kappa (>= 0) # if kappa = 0 generate uniform random angle # Based upon an algorithm published in: Fisher, N.I., # "Statistical Analysis of Circular Data", Cambridge # University Press, 1993. # Thanks to Magnus Kessler for a correction to the # implementation of step 4. random = self.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) while 1: u1 = random() z = _cos(_pi * u1) f = (1.0 + r * z)/(r + z) c = kappa * (r - f) u2 = random() if not (u2 >= c * (2.0 - c) and u2 > c * _exp(1.0 - c)): break u3 = random() if u3 > 0.5: theta = (mu % TWOPI) + _acos(f) else: theta = (mu % TWOPI) - _acos(f) return theta
def vonmisesvariate(self, mu, kappa): # mu: mean angle (in radians between 0 and 2*pi) # kappa: concentration parameter kappa (>= 0) # if kappa = 0 generate uniform random angle # Based upon an algorithm published in: Fisher, N.I., # "Statistical Analysis of Circular Data", Cambridge # University Press, 1993. # Thanks to Magnus Kessler for a correction to the # implementation of step 4. random = self.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) while 1: u1 = random() z = _cos(_pi * u1) f = (1.0 + r * z) / (r + z) c = kappa * (r - f) u2 = random() if not (u2 >= c * (2.0 - c) and u2 > c * _exp(1.0 - c)): break u3 = random() if u3 > 0.5: theta = (mu % TWOPI) + _acos(f) else: theta = (mu % TWOPI) - _acos(f) return theta
def lognormvariate(self, mu, sigma): return _exp(self.normalvariate(mu, sigma))
from VS import log as _log, exp as _exp from VS import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin __all__ = ["Random","seed","random","uniform","randint","choice", "randrange","shuffle","normalvariate","lognormvariate", "cunifvariate","expovariate","vonmisesvariate","gammavariate", "stdgamma","gauss","betavariate","paretovariate","weibullvariate", "getstate","setstate","jumpahead","whseed"] def _verify(name, computed, expected): if abs(computed - expected) > 1e-7: raise ValueError( "computed value for %s deviates too much " "(computed %g, expected %g)" % (name, computed, expected)) NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) _verify('NV_MAGICCONST', NV_MAGICCONST, 1.71552776992141) TWOPI = 2.0*_pi _verify('TWOPI', TWOPI, 6.28318530718) LOG4 = _log(4.0) _verify('LOG4', LOG4, 1.38629436111989) SG_MAGICCONST = 1.0 + _log(4.5) _verify('SG_MAGICCONST', SG_MAGICCONST, 2.50407739677627) del _verify # Translated by Guido van Rossum from C source provided by # Adrian Baddeley.
"Random", "seed", "random", "uniform", "randint", "choice", "randrange", "shuffle", "normalvariate", "lognormvariate", "cunifvariate", "expovariate", "vonmisesvariate", "gammavariate", "stdgamma", "gauss", "betavariate", "paretovariate", "weibullvariate", "getstate", "setstate", "jumpahead", "whseed" ] def _verify(name, computed, expected): if abs(computed - expected) > 1e-7: raise ValueError("computed value for %s deviates too much " "(computed %g, expected %g)" % (name, computed, expected)) NV_MAGICCONST = 4 * _exp(-0.5) / _sqrt(2.0) _verify('NV_MAGICCONST', NV_MAGICCONST, 1.71552776992141) TWOPI = 2.0 * _pi _verify('TWOPI', TWOPI, 6.28318530718) LOG4 = _log(4.0) _verify('LOG4', LOG4, 1.38629436111989) SG_MAGICCONST = 1.0 + _log(4.5) _verify('SG_MAGICCONST', SG_MAGICCONST, 2.50407739677627) del _verify # Translated by Guido van Rossum from C source provided by # Adrian Baddeley.