random.py revision 95bfcda3e0be2ace895e021296328a383eafb273
1ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# R A N D O M V A R I A B L E G E N E R A T O R S 2ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# 3ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# distributions on the real line: 4ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# ------------------------------ 5ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# normal (Gaussian) 6ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# lognormal 7ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# negative exponential 8ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# gamma 995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# beta 10ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# 11ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# distributions on the circle (angles 0 to 2pi) 12ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# --------------------------------------------- 13ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# circular uniform 14ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# von Mises 15ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 16ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# Translated from anonymously contributed C/C++ source. 17ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 18ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumfrom whrandom import random, uniform, randint, choice # Also for export! 1995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossumfrom math import log, exp, pi, e, sqrt, acos, cos, sin 20ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 21ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# Housekeeping function to verify that magic constants have been 22ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# computed correctly 23ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 24ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef verify(name, expected): 25ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum computed = eval(name) 26ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if abs(computed - expected) > 1e-7: 27ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum raise ValueError, \ 28ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 'computed value for %s deviates too much (computed %g, expected %g)' % \ 29ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum (name, computed, expected) 30ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 31ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- normal distribution -------------------- 32ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 33ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van RossumNV_MAGICCONST = 4*exp(-0.5)/sqrt(2) 34ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumverify('NV_MAGICCONST', 1.71552776992141) 35ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef normalvariate(mu, sigma): 36ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # mu = mean, sigma = standard deviation 37ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 38ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # Uses Kinderman and Monahan method. Reference: Kinderman, 39ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # A.J. and Monahan, J.F., "Computer generation of random 40ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # variables using the ratio of uniform deviates", ACM Trans 41ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # Math Software, 3, (1977), pp257-260. 42ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 43ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum while 1: 44ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u1 = random() 45ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u2 = random() 46ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum z = NV_MAGICCONST*(u1-0.5)/u2 47ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum zz = z*z/4 48ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if zz <= -log(u2): 49ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum break 50ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return mu+z*sigma 51ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 52ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- lognormal distribution -------------------- 53ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 54ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef lognormvariate(mu, sigma): 55ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return exp(normalvariate(mu, sigma)) 56ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 57ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- circular uniform -------------------- 58ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 59ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef cunifvariate(mean, arc): 60ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # mean: mean angle (in radians between 0 and pi) 61ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # arc: range of distribution (in radians between 0 and pi) 62ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 63ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return (mean + arc * (random() - 0.5)) % pi 64ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 65ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- exponential distribution -------------------- 66ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 67ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef expovariate(lambd): 68ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # lambd: rate lambd = 1/mean 69ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # ('lambda' is a Python reserved word) 70ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 71ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u = random() 72ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum while u <= 1e-7: 73ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u = random() 74ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return -log(u)/lambd 75ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 76ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- von Mises distribution -------------------- 77ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 78ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van RossumTWOPI = 2*pi 79ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumverify('TWOPI', 6.28318530718) 80ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 81ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef vonmisesvariate(mu, kappa): 82ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # mu: mean angle (in radians between 0 and 180 degrees) 83ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # kappa: concentration parameter kappa (>= 0) 84ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 85ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # if kappa = 0 generate uniform random angle 86ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if kappa <= 1e-6: 87ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return TWOPI * random() 88ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 89ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum a = 1.0 + sqrt(1 + 4 * kappa * kappa) 90ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum b = (a - sqrt(2 * a))/(2 * kappa) 91ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum r = (1 + b * b)/(2 * b) 92ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 93ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum while 1: 94ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u1 = random() 95ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 96ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum z = cos(pi * u1) 97ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum f = (1 + r * z)/(r + z) 98ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum c = kappa * (r - f) 99ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 100ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u2 = random() 101ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 102ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if not (u2 >= c * (2.0 - c) and u2 > c * exp(1.0 - c)): 103ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum break 104ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 105ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u3 = random() 106ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if u3 > 0.5: 107ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum theta = mu + 0.5*acos(f) 108ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum else: 109ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum theta = mu - 0.5*acos(f) 110ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 111ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return theta % pi 112ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 113ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- gamma distribution -------------------- 114ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 115ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van RossumLOG4 = log(4) 116ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumverify('LOG4', 1.38629436111989) 117ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 118ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef gammavariate(alpha, beta): 119ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # beta times standard gamma 120ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum ainv = sqrt(2 * alpha - 1) 121ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return beta * stdgamma(alpha, ainv, alpha - LOG4, alpha + ainv) 122ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 123ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van RossumSG_MAGICCONST = 1+log(4.5) 124ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumverify('SG_MAGICCONST', 2.50407739677627) 125ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 126ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef stdgamma(alpha, ainv, bbb, ccc): 127ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # ainv = sqrt(2 * alpha - 1) 128ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # bbb = alpha - log(4) 129ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # ccc = alpha + ainv 130ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 131ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if alpha <= 0.0: 132ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum raise ValueError, 'stdgamma: alpha must be > 0.0' 133ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 134ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if alpha > 1.0: 135ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 136ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # Uses R.C.H. Cheng, "The generation of Gamma 137ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # variables with non-integral shape parameters", 138ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # Applied Statistics, (1977), 26, No. 1, p71-74 139ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 140ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum while 1: 141ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u1 = random() 142ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u2 = random() 143ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum v = log(u1/(1-u1))/ainv 144ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum x = alpha*exp(v) 145ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum z = u1*u1*u2 146ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum r = bbb+ccc*v-x 147ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if r + SG_MAGICCONST - 4.5*z >= 0 or r >= log(z): 148ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return x 149ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 150ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum elif alpha == 1.0: 151ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # expovariate(1) 152ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u = random() 153ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum while u <= 1e-7: 154ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u = random() 155ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return -log(u) 156ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 157ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum else: # alpha is between 0 and 1 (exclusive) 158ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 159ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle 160ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 161ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum while 1: 162ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u = random() 163ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum b = (e + alpha)/e 164ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum p = b*u 165ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if p <= 1.0: 166ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum x = pow(p, 1.0/alpha) 167ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum else: 168ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum # p > 1 169ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum x = -log((b-p)/alpha) 170ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum u1 = random() 171ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum if not (((p <= 1.0) and (u1 > exp(-x))) or 172ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum ((p > 1) and (u1 > pow(x, alpha - 1.0)))): 173ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum break 174ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum return x 175ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 17695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 17795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# -------------------- Gauss (faster alternative) -------------------- 17895bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 17995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# When x and y are two variables from [0, 1), uniformly distributed, then 18095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# 18195bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# cos(2*pi*x)*log(1-y) 18295bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# sin(2*pi*x)*log(1-y) 18395bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# 18495bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# are two *independent* variables with normal distribution (mu = 0, sigma = 1). 18595bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# (Lambert Meertens) 18695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 18795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossumgauss_next = None 18895bfcda3e0be2ace895e021296328a383eafb273Guido van Rossumdef gauss(mu, sigma): 18995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum global gauss_next 19095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum if gauss_next != None: 19195bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum z = gauss_next 19295bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum gauss_next = None 19395bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum else: 19495bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum x2pi = random() * TWOPI 19595bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum log1_y = log(1.0 - random()) 19695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum z = cos(x2pi) * log1_y 19795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum gauss_next = sin(x2pi) * log1_y 19895bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum return mu + z*sigma 19995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 20095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum# -------------------- beta -------------------- 20195bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 20295bfcda3e0be2ace895e021296328a383eafb273Guido van Rossumdef betavariate(alpha, beta): 20395bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum y = expovariate(alpha) 20495bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum z = expovariate(1.0/beta) 20595bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum return z/(y+z) 20695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 207ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum# -------------------- test program -------------------- 208ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 209ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef test(): 210ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum print 'TWOPI =', TWOPI 211ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum print 'LOG4 =', LOG4 212ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum print 'NV_MAGICCONST =', NV_MAGICCONST 213ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum print 'SG_MAGICCONST =', SG_MAGICCONST 21495bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum N = 200 215ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'random()') 216ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'normalvariate(0.0, 1.0)') 217ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'lognormvariate(0.0, 1.0)') 218ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'cunifvariate(0.0, 1.0)') 219ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'expovariate(1.0)') 220ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'vonmisesvariate(0.0, 1.0)') 221ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'gammavariate(0.5, 1.0)') 222ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'gammavariate(0.9, 1.0)') 223ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'gammavariate(1.0, 1.0)') 224ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'gammavariate(2.0, 1.0)') 225ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'gammavariate(20.0, 1.0)') 226ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test_generator(N, 'gammavariate(200.0, 1.0)') 22795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum test_generator(N, 'gauss(0.0, 1.0)') 22895bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum test_generator(N, 'betavariate(3.0, 3.0)') 229ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 230ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumdef test_generator(n, funccall): 23195bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum import time 23295bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum print n, 'times', funccall 233ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum code = compile(funccall, funccall, 'eval') 234ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum sum = 0.0 235ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum sqsum = 0.0 23695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum smallest = 1e10 23795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum largest = 1e-10 23895bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum t0 = time.time() 239ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum for i in range(n): 240ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum x = eval(code) 241ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum sum = sum + x 242ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum sqsum = sqsum + x*x 24395bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum smallest = min(x, smallest) 24495bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum largest = max(x, largest) 24595bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum t1 = time.time() 24695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum print round(t1-t0, 3), 'sec,', 247ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum avg = sum/n 248ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum stddev = sqrt(sqsum/n - avg*avg) 24995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum print 'avg %g, stddev %g, min %g, max %g' % \ 25095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum (avg, stddev, smallest, largest) 251ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 252ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumif __name__ == '__main__': 253ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum test() 254