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