blob: 465f477a80101661909b03341017a6110114ab67 [file] [log] [blame]
Guido van Rossume7b146f2000-02-04 15:28:42 +00001"""Random variable generators.
Guido van Rossumff03b1a1994-03-09 12:55:02 +00002
Tim Petersd7b5e882001-01-25 03:36:26 +00003 integers
4 --------
5 uniform within range
6
7 sequences
8 ---------
9 pick random element
Raymond Hettingerf24eb352002-11-12 17:41:57 +000010 pick random sample
Tim Petersd7b5e882001-01-25 03:36:26 +000011 generate random permutation
12
Guido van Rossume7b146f2000-02-04 15:28:42 +000013 distributions on the real line:
14 ------------------------------
Tim Petersd7b5e882001-01-25 03:36:26 +000015 uniform
Guido van Rossume7b146f2000-02-04 15:28:42 +000016 normal (Gaussian)
17 lognormal
18 negative exponential
19 gamma
20 beta
Raymond Hettinger40f62172002-12-29 23:03:38 +000021 pareto
22 Weibull
Guido van Rossumff03b1a1994-03-09 12:55:02 +000023
Guido van Rossume7b146f2000-02-04 15:28:42 +000024 distributions on the circle (angles 0 to 2pi)
25 ---------------------------------------------
26 circular uniform
27 von Mises
28
Raymond Hettinger40f62172002-12-29 23:03:38 +000029General notes on the underlying Mersenne Twister core generator:
Guido van Rossume7b146f2000-02-04 15:28:42 +000030
Raymond Hettinger40f62172002-12-29 23:03:38 +000031* The period is 2**19937-1.
32* It is one of the most extensively tested generators in existence
33* Without a direct way to compute N steps forward, the
34 semantics of jumpahead(n) are weakened to simply jump
35 to another distant state and rely on the large period
36 to avoid overlapping sequences.
37* The random() method is implemented in C, executes in
38 a single Python step, and is, therefore, threadsafe.
Tim Peterse360d952001-01-26 10:00:39 +000039
Guido van Rossume7b146f2000-02-04 15:28:42 +000040"""
Guido van Rossumd03e1191998-05-29 17:51:31 +000041
Raymond Hettinger2f726e92003-10-05 09:09:15 +000042from warnings import warn as _warn
43from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
Raymond Hettinger91e27c22005-08-19 01:36:35 +000044from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
Tim Petersd7b5e882001-01-25 03:36:26 +000045from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
Raymond Hettingerc1c43ca2004-09-05 00:00:42 +000046from os import urandom as _urandom
47from binascii import hexlify as _hexlify
Guido van Rossumff03b1a1994-03-09 12:55:02 +000048
Raymond Hettingerf24eb352002-11-12 17:41:57 +000049__all__ = ["Random","seed","random","uniform","randint","choice","sample",
Skip Montanaro0de65802001-02-15 22:15:14 +000050 "randrange","shuffle","normalvariate","lognormvariate",
Raymond Hettingerf8a52d32003-08-05 12:23:19 +000051 "expovariate","vonmisesvariate","gammavariate",
52 "gauss","betavariate","paretovariate","weibullvariate",
Raymond Hettinger356a4592004-08-30 06:14:31 +000053 "getstate","setstate","jumpahead", "WichmannHill", "getrandbits",
Raymond Hettinger23f12412004-09-13 22:23:21 +000054 "SystemRandom"]
Tim Petersd7b5e882001-01-25 03:36:26 +000055
56NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000057TWOPI = 2.0*_pi
Tim Petersd7b5e882001-01-25 03:36:26 +000058LOG4 = _log(4.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000059SG_MAGICCONST = 1.0 + _log(4.5)
Raymond Hettinger2f726e92003-10-05 09:09:15 +000060BPF = 53 # Number of bits in a float
Tim Peters7c2a85b2004-08-31 02:19:55 +000061RECIP_BPF = 2**-BPF
Tim Petersd7b5e882001-01-25 03:36:26 +000062
Raymond Hettinger356a4592004-08-30 06:14:31 +000063
Tim Petersd7b5e882001-01-25 03:36:26 +000064# Translated by Guido van Rossum from C source provided by
Raymond Hettinger40f62172002-12-29 23:03:38 +000065# Adrian Baddeley. Adapted by Raymond Hettinger for use with
Raymond Hettinger3fa19d72004-08-31 01:05:15 +000066# the Mersenne Twister and os.urandom() core generators.
Tim Petersd7b5e882001-01-25 03:36:26 +000067
Raymond Hettinger145a4a02003-01-07 10:25:55 +000068import _random
Raymond Hettinger40f62172002-12-29 23:03:38 +000069
Raymond Hettinger145a4a02003-01-07 10:25:55 +000070class Random(_random.Random):
Raymond Hettingerc32f0332002-05-23 19:44:49 +000071 """Random number generator base class used by bound module functions.
72
73 Used to instantiate instances of Random to get generators that don't
74 share state. Especially useful for multi-threaded programs, creating
75 a different instance of Random for each thread, and using the jumpahead()
76 method to ensure that the generated sequences seen by each thread don't
77 overlap.
78
79 Class Random can also be subclassed if you want to use a different basic
80 generator of your own devising: in that case, override the following
81 methods: random(), seed(), getstate(), setstate() and jumpahead().
Raymond Hettinger2f726e92003-10-05 09:09:15 +000082 Optionally, implement a getrandombits() method so that randrange()
83 can cover arbitrarily large ranges.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +000084
Raymond Hettingerc32f0332002-05-23 19:44:49 +000085 """
Tim Petersd7b5e882001-01-25 03:36:26 +000086
Raymond Hettinger40f62172002-12-29 23:03:38 +000087 VERSION = 2 # used by getstate/setstate
Tim Petersd7b5e882001-01-25 03:36:26 +000088
89 def __init__(self, x=None):
90 """Initialize an instance.
91
92 Optional argument x controls seeding, as for Random.seed().
93 """
94
95 self.seed(x)
Raymond Hettinger40f62172002-12-29 23:03:38 +000096 self.gauss_next = None
Tim Petersd7b5e882001-01-25 03:36:26 +000097
Tim Peters0de88fc2001-02-01 04:59:18 +000098 def seed(self, a=None):
99 """Initialize internal state from hashable object.
Tim Petersd7b5e882001-01-25 03:36:26 +0000100
Raymond Hettinger23f12412004-09-13 22:23:21 +0000101 None or no argument seeds from current time or from an operating
102 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000103
Tim Petersbcd725f2001-02-01 10:06:53 +0000104 If a is not None or an int or long, hash(a) is used instead.
Tim Petersd7b5e882001-01-25 03:36:26 +0000105 """
106
Raymond Hettinger3081d592003-08-09 18:30:57 +0000107 if a is None:
Raymond Hettingerc1c43ca2004-09-05 00:00:42 +0000108 try:
109 a = long(_hexlify(_urandom(16)), 16)
110 except NotImplementedError:
Raymond Hettinger356a4592004-08-30 06:14:31 +0000111 import time
112 a = long(time.time() * 256) # use fractional seconds
Raymond Hettinger356a4592004-08-30 06:14:31 +0000113
Raymond Hettinger145a4a02003-01-07 10:25:55 +0000114 super(Random, self).seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000115 self.gauss_next = None
116
Tim Peterscd804102001-01-25 20:25:57 +0000117 def getstate(self):
118 """Return internal state; can be passed to setstate() later."""
Raymond Hettinger145a4a02003-01-07 10:25:55 +0000119 return self.VERSION, super(Random, self).getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000120
121 def setstate(self, state):
122 """Restore internal state from object returned by getstate()."""
123 version = state[0]
Raymond Hettinger40f62172002-12-29 23:03:38 +0000124 if version == 2:
125 version, internalstate, self.gauss_next = state
Raymond Hettinger145a4a02003-01-07 10:25:55 +0000126 super(Random, self).setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000127 else:
128 raise ValueError("state with version %s passed to "
129 "Random.setstate() of version %s" %
130 (version, self.VERSION))
131
Tim Peterscd804102001-01-25 20:25:57 +0000132## ---- Methods below this point do not need to be overridden when
133## ---- subclassing for the purpose of using a different core generator.
134
135## -------------------- pickle support -------------------
136
137 def __getstate__(self): # for pickle
138 return self.getstate()
139
140 def __setstate__(self, state): # for pickle
141 self.setstate(state)
142
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000143 def __reduce__(self):
144 return self.__class__, (), self.getstate()
145
Tim Peterscd804102001-01-25 20:25:57 +0000146## -------------------- integer methods -------------------
147
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000148 def randrange(self, start, stop=None, step=1, int=int, default=None,
149 maxwidth=1L<<BPF):
Tim Petersd7b5e882001-01-25 03:36:26 +0000150 """Choose a random item from range(start, stop[, step]).
151
152 This fixes the problem with randint() which includes the
153 endpoint; in Python this is usually not what you want.
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000154 Do not supply the 'int', 'default', and 'maxwidth' arguments.
Tim Petersd7b5e882001-01-25 03:36:26 +0000155 """
156
157 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000158 # common case while still doing adequate error checking.
Tim Petersd7b5e882001-01-25 03:36:26 +0000159 istart = int(start)
160 if istart != start:
161 raise ValueError, "non-integer arg 1 for randrange()"
162 if stop is default:
163 if istart > 0:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000164 if istart >= maxwidth:
165 return self._randbelow(istart)
Tim Petersd7b5e882001-01-25 03:36:26 +0000166 return int(self.random() * istart)
167 raise ValueError, "empty range for randrange()"
Tim Peters9146f272002-08-16 03:41:39 +0000168
169 # stop argument supplied.
Tim Petersd7b5e882001-01-25 03:36:26 +0000170 istop = int(stop)
171 if istop != stop:
172 raise ValueError, "non-integer stop for randrange()"
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000173 width = istop - istart
174 if step == 1 and width > 0:
Tim Peters76ca1d42003-06-19 03:46:46 +0000175 # Note that
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000176 # int(istart + self.random()*width)
Tim Peters76ca1d42003-06-19 03:46:46 +0000177 # instead would be incorrect. For example, consider istart
178 # = -2 and istop = 0. Then the guts would be in
179 # -2.0 to 0.0 exclusive on both ends (ignoring that random()
180 # might return 0.0), and because int() truncates toward 0, the
181 # final result would be -1 or 0 (instead of -2 or -1).
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000182 # istart + int(self.random()*width)
Tim Peters76ca1d42003-06-19 03:46:46 +0000183 # would also be incorrect, for a subtler reason: the RHS
184 # can return a long, and then randrange() would also return
185 # a long, but we're supposed to return an int (for backward
186 # compatibility).
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000187
188 if width >= maxwidth:
Tim Peters58eb11c2004-01-18 20:29:55 +0000189 return int(istart + self._randbelow(width))
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000190 return int(istart + int(self.random()*width))
Tim Petersd7b5e882001-01-25 03:36:26 +0000191 if step == 1:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000192 raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width)
Tim Peters9146f272002-08-16 03:41:39 +0000193
194 # Non-unit step argument supplied.
Tim Petersd7b5e882001-01-25 03:36:26 +0000195 istep = int(step)
196 if istep != step:
197 raise ValueError, "non-integer step for randrange()"
198 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000199 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000200 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000201 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000202 else:
203 raise ValueError, "zero step for randrange()"
204
205 if n <= 0:
206 raise ValueError, "empty range for randrange()"
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000207
208 if n >= maxwidth:
209 return istart + self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000210 return istart + istep*int(self.random() * n)
211
212 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000213 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000214 """
215
216 return self.randrange(a, b+1)
217
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000218 def _randbelow(self, n, _log=_log, int=int, _maxwidth=1L<<BPF,
219 _Method=_MethodType, _BuiltinMethod=_BuiltinMethodType):
220 """Return a random int in the range [0,n)
221
222 Handles the case where n has more bits than returned
223 by a single call to the underlying generator.
224 """
225
226 try:
227 getrandbits = self.getrandbits
228 except AttributeError:
229 pass
230 else:
231 # Only call self.getrandbits if the original random() builtin method
232 # has not been overridden or if a new getrandbits() was supplied.
233 # This assures that the two methods correspond.
234 if type(self.random) is _BuiltinMethod or type(getrandbits) is _Method:
235 k = int(1.00001 + _log(n-1, 2.0)) # 2**k > n-1 > 2**(k-2)
236 r = getrandbits(k)
237 while r >= n:
238 r = getrandbits(k)
239 return r
240 if n >= _maxwidth:
241 _warn("Underlying random() generator does not supply \n"
242 "enough bits to choose from a population range this large")
243 return int(self.random() * n)
244
Tim Peterscd804102001-01-25 20:25:57 +0000245## -------------------- sequence methods -------------------
246
Tim Petersd7b5e882001-01-25 03:36:26 +0000247 def choice(self, seq):
248 """Choose a random element from a non-empty sequence."""
Raymond Hettinger5dae5052004-06-07 02:07:15 +0000249 return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
Tim Petersd7b5e882001-01-25 03:36:26 +0000250
251 def shuffle(self, x, random=None, int=int):
252 """x, random=random.random -> shuffle list x in place; return None.
253
254 Optional arg random is a 0-argument function returning a random
255 float in [0.0, 1.0); by default, the standard random.random.
256
257 Note that for even rather small len(x), the total number of
258 permutations of x is larger than the period of most random number
259 generators; this implies that "most" permutations of a long
260 sequence can never be generated.
261 """
262
263 if random is None:
264 random = self.random
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000265 for i in reversed(xrange(1, len(x))):
Tim Peterscd804102001-01-25 20:25:57 +0000266 # pick an element in x[:i+1] with which to exchange x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000267 j = int(random() * (i+1))
268 x[i], x[j] = x[j], x[i]
269
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000270 def sample(self, population, k):
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000271 """Chooses k unique random elements from a population sequence.
272
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000273 Returns a new list containing elements from the population while
274 leaving the original population unchanged. The resulting list is
275 in selection order so that all sub-slices will also be valid random
276 samples. This allows raffle winners (the sample) to be partitioned
277 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000278
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000279 Members of the population need not be hashable or unique. If the
280 population contains repeats, then each occurrence is a possible
281 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000282
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000283 To choose a sample in a range of integers, use xrange as an argument.
284 This is especially fast and space efficient for sampling from a
285 large population: sample(xrange(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000286 """
287
Tim Petersc17976e2006-04-01 00:26:53 +0000288 # XXX Although the documentation says `population` is "a sequence",
289 # XXX attempts are made to cater to any iterable with a __len__
290 # XXX method. This has had mixed success. Examples from both
291 # XXX sides: sets work fine, and should become officially supported;
292 # XXX dicts are much harder, and have failed in various subtle
293 # XXX ways across attempts. Support for mapping types should probably
294 # XXX be dropped (and users should pass mapping.keys() or .values()
295 # XXX explicitly).
296
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000297 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000298 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000299
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000300 # When the number of selections is small compared to the
301 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000302 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000303 # a larger number of selections, the pool tracking method is
304 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000305 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000306
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000307 n = len(population)
308 if not 0 <= k <= n:
309 raise ValueError, "sample larger than population"
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000310 random = self.random
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000311 _int = int
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000312 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000313 setsize = 21 # size of a small set minus size of an empty list
314 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000315 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Tim Petersc17976e2006-04-01 00:26:53 +0000316 if n <= setsize or hasattr(population, "keys"):
317 # An n-length list is smaller than a k-length set, or this is a
318 # mapping type so the other algorithm wouldn't work.
Raymond Hettinger311f4192002-11-18 09:01:24 +0000319 pool = list(population)
320 for i in xrange(k): # invariant: non-selected at [0,n-i)
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000321 j = _int(random() * (n-i))
Raymond Hettinger311f4192002-11-18 09:01:24 +0000322 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000323 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000324 else:
Raymond Hettinger66d09f12003-09-06 04:25:54 +0000325 try:
Raymond Hettinger3c3346d2006-03-29 09:13:13 +0000326 selected = set()
327 selected_add = selected.add
328 for i in xrange(k):
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000329 j = _int(random() * n)
Raymond Hettinger3c3346d2006-03-29 09:13:13 +0000330 while j in selected:
331 j = _int(random() * n)
332 selected_add(j)
333 result[i] = population[j]
Tim Petersc17976e2006-04-01 00:26:53 +0000334 except (TypeError, KeyError): # handle (at least) sets
Raymond Hettinger3c3346d2006-03-29 09:13:13 +0000335 if isinstance(population, list):
336 raise
Tim Petersc17976e2006-04-01 00:26:53 +0000337 return self.sample(tuple(population), k)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000338 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000339
Tim Peterscd804102001-01-25 20:25:57 +0000340## -------------------- real-valued distributions -------------------
341
342## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000343
344 def uniform(self, a, b):
345 """Get a random number in the range [a, b)."""
346 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000347
Tim Peterscd804102001-01-25 20:25:57 +0000348## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000349
Tim Petersd7b5e882001-01-25 03:36:26 +0000350 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000351 """Normal distribution.
352
353 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000354
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000355 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000356 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000357
Tim Petersd7b5e882001-01-25 03:36:26 +0000358 # Uses Kinderman and Monahan method. Reference: Kinderman,
359 # A.J. and Monahan, J.F., "Computer generation of random
360 # variables using the ratio of uniform deviates", ACM Trans
361 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000362
Tim Petersd7b5e882001-01-25 03:36:26 +0000363 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000364 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000365 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000366 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000367 z = NV_MAGICCONST*(u1-0.5)/u2
368 zz = z*z/4.0
369 if zz <= -_log(u2):
370 break
371 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000372
Tim Peterscd804102001-01-25 20:25:57 +0000373## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000374
375 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000376 """Log normal distribution.
377
378 If you take the natural logarithm of this distribution, you'll get a
379 normal distribution with mean mu and standard deviation sigma.
380 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000381
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000382 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000383 return _exp(self.normalvariate(mu, sigma))
384
Tim Peterscd804102001-01-25 20:25:57 +0000385## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000386
387 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000388 """Exponential distribution.
389
390 lambd is 1.0 divided by the desired mean. (The parameter would be
391 called "lambda", but that is a reserved word in Python.) Returned
392 values range from 0 to positive infinity.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000393
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000394 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000395 # lambd: rate lambd = 1/mean
396 # ('lambda' is a Python reserved word)
397
398 random = self.random
Tim Peters0c9886d2001-01-15 01:18:21 +0000399 u = random()
400 while u <= 1e-7:
401 u = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000402 return -_log(u)/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000403
Tim Peterscd804102001-01-25 20:25:57 +0000404## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000405
Tim Petersd7b5e882001-01-25 03:36:26 +0000406 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000407 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000408
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000409 mu is the mean angle, expressed in radians between 0 and 2*pi, and
410 kappa is the concentration parameter, which must be greater than or
411 equal to zero. If kappa is equal to zero, this distribution reduces
412 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000413
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000414 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000415 # mu: mean angle (in radians between 0 and 2*pi)
416 # kappa: concentration parameter kappa (>= 0)
417 # if kappa = 0 generate uniform random angle
418
419 # Based upon an algorithm published in: Fisher, N.I.,
420 # "Statistical Analysis of Circular Data", Cambridge
421 # University Press, 1993.
422
423 # Thanks to Magnus Kessler for a correction to the
424 # implementation of step 4.
425
426 random = self.random
427 if kappa <= 1e-6:
428 return TWOPI * random()
429
430 a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa)
431 b = (a - _sqrt(2.0 * a))/(2.0 * kappa)
432 r = (1.0 + b * b)/(2.0 * b)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000433
Raymond Hettinger42406e62005-04-30 09:02:51 +0000434 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000435 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000436
437 z = _cos(_pi * u1)
438 f = (1.0 + r * z)/(r + z)
439 c = kappa * (r - f)
440
441 u2 = random()
442
Raymond Hettinger42406e62005-04-30 09:02:51 +0000443 if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c):
Tim Peters0c9886d2001-01-15 01:18:21 +0000444 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000445
446 u3 = random()
447 if u3 > 0.5:
448 theta = (mu % TWOPI) + _acos(f)
449 else:
450 theta = (mu % TWOPI) - _acos(f)
451
452 return theta
453
Tim Peterscd804102001-01-25 20:25:57 +0000454## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000455
456 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000457 """Gamma distribution. Not the gamma function!
458
459 Conditions on the parameters are alpha > 0 and beta > 0.
460
461 """
Tim Peters8ac14952002-05-23 15:15:30 +0000462
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000463 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000464
Guido van Rossum570764d2002-05-14 14:08:12 +0000465 # Warning: a few older sources define the gamma distribution in terms
466 # of alpha > -1.0
467 if alpha <= 0.0 or beta <= 0.0:
468 raise ValueError, 'gammavariate: alpha and beta must be > 0.0'
Tim Peters8ac14952002-05-23 15:15:30 +0000469
Tim Petersd7b5e882001-01-25 03:36:26 +0000470 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000471 if alpha > 1.0:
472
473 # Uses R.C.H. Cheng, "The generation of Gamma
474 # variables with non-integral shape parameters",
475 # Applied Statistics, (1977), 26, No. 1, p71-74
476
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000477 ainv = _sqrt(2.0 * alpha - 1.0)
478 bbb = alpha - LOG4
479 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000480
Raymond Hettinger42406e62005-04-30 09:02:51 +0000481 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000482 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000483 if not 1e-7 < u1 < .9999999:
484 continue
485 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000486 v = _log(u1/(1.0-u1))/ainv
487 x = alpha*_exp(v)
488 z = u1*u1*u2
489 r = bbb+ccc*v-x
490 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000491 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000492
493 elif alpha == 1.0:
494 # expovariate(1)
495 u = random()
496 while u <= 1e-7:
497 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000498 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000499
500 else: # alpha is between 0 and 1 (exclusive)
501
502 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
503
Raymond Hettinger42406e62005-04-30 09:02:51 +0000504 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000505 u = random()
506 b = (_e + alpha)/_e
507 p = b*u
508 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000509 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000510 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000511 x = -_log((b-p)/alpha)
512 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000513 if p > 1.0:
514 if u1 <= x ** (alpha - 1.0):
515 break
516 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000517 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000518 return x * beta
519
Tim Peterscd804102001-01-25 20:25:57 +0000520## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000521
Tim Petersd7b5e882001-01-25 03:36:26 +0000522 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000523 """Gaussian distribution.
524
525 mu is the mean, and sigma is the standard deviation. This is
526 slightly faster than the normalvariate() function.
527
528 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000529
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000530 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000531
Tim Petersd7b5e882001-01-25 03:36:26 +0000532 # When x and y are two variables from [0, 1), uniformly
533 # distributed, then
534 #
535 # cos(2*pi*x)*sqrt(-2*log(1-y))
536 # sin(2*pi*x)*sqrt(-2*log(1-y))
537 #
538 # are two *independent* variables with normal distribution
539 # (mu = 0, sigma = 1).
540 # (Lambert Meertens)
541 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000542
Tim Petersd7b5e882001-01-25 03:36:26 +0000543 # Multithreading note: When two threads call this function
544 # simultaneously, it is possible that they will receive the
545 # same return value. The window is very small though. To
546 # avoid this, you have to use a lock around all calls. (I
547 # didn't want to slow this down in the serial case by using a
548 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000549
Tim Petersd7b5e882001-01-25 03:36:26 +0000550 random = self.random
551 z = self.gauss_next
552 self.gauss_next = None
553 if z is None:
554 x2pi = random() * TWOPI
555 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
556 z = _cos(x2pi) * g2rad
557 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000558
Tim Petersd7b5e882001-01-25 03:36:26 +0000559 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000560
Tim Peterscd804102001-01-25 20:25:57 +0000561## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000562## See
563## http://sourceforge.net/bugs/?func=detailbug&bug_id=130030&group_id=5470
564## for Ivan Frohne's insightful analysis of why the original implementation:
565##
566## def betavariate(self, alpha, beta):
567## # Discrete Event Simulation in C, pp 87-88.
568##
569## y = self.expovariate(alpha)
570## z = self.expovariate(1.0/beta)
571## return z/(y+z)
572##
573## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000574
Tim Petersd7b5e882001-01-25 03:36:26 +0000575 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000576 """Beta distribution.
577
578 Conditions on the parameters are alpha > -1 and beta} > -1.
579 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000580
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000581 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000582
Tim Peters85e2e472001-01-26 06:49:56 +0000583 # This version due to Janne Sinkkonen, and matches all the std
584 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
585 y = self.gammavariate(alpha, 1.)
586 if y == 0:
587 return 0.0
588 else:
589 return y / (y + self.gammavariate(beta, 1.))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000590
Tim Peterscd804102001-01-25 20:25:57 +0000591## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000592
Tim Petersd7b5e882001-01-25 03:36:26 +0000593 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000594 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000595 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000596
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000597 u = 1.0 - self.random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000598 return 1.0 / pow(u, 1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000599
Tim Peterscd804102001-01-25 20:25:57 +0000600## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000601
Tim Petersd7b5e882001-01-25 03:36:26 +0000602 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000603 """Weibull distribution.
604
605 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000606
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000607 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000608 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000609
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000610 u = 1.0 - self.random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000611 return alpha * pow(-_log(u), 1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000612
Raymond Hettinger40f62172002-12-29 23:03:38 +0000613## -------------------- Wichmann-Hill -------------------
614
615class WichmannHill(Random):
616
617 VERSION = 1 # used by getstate/setstate
618
619 def seed(self, a=None):
620 """Initialize internal state from hashable object.
621
Raymond Hettinger23f12412004-09-13 22:23:21 +0000622 None or no argument seeds from current time or from an operating
623 system specific randomness source if available.
Raymond Hettinger40f62172002-12-29 23:03:38 +0000624
625 If a is not None or an int or long, hash(a) is used instead.
626
627 If a is an int or long, a is used directly. Distinct values between
628 0 and 27814431486575L inclusive are guaranteed to yield distinct
629 internal states (this guarantee is specific to the default
630 Wichmann-Hill generator).
631 """
632
633 if a is None:
Raymond Hettingerc1c43ca2004-09-05 00:00:42 +0000634 try:
635 a = long(_hexlify(_urandom(16)), 16)
636 except NotImplementedError:
Raymond Hettinger356a4592004-08-30 06:14:31 +0000637 import time
638 a = long(time.time() * 256) # use fractional seconds
Raymond Hettinger40f62172002-12-29 23:03:38 +0000639
640 if not isinstance(a, (int, long)):
641 a = hash(a)
642
643 a, x = divmod(a, 30268)
644 a, y = divmod(a, 30306)
645 a, z = divmod(a, 30322)
646 self._seed = int(x)+1, int(y)+1, int(z)+1
647
648 self.gauss_next = None
649
650 def random(self):
651 """Get the next random number in the range [0.0, 1.0)."""
652
653 # Wichman-Hill random number generator.
654 #
655 # Wichmann, B. A. & Hill, I. D. (1982)
656 # Algorithm AS 183:
657 # An efficient and portable pseudo-random number generator
658 # Applied Statistics 31 (1982) 188-190
659 #
660 # see also:
661 # Correction to Algorithm AS 183
662 # Applied Statistics 33 (1984) 123
663 #
664 # McLeod, A. I. (1985)
665 # A remark on Algorithm AS 183
666 # Applied Statistics 34 (1985),198-200
667
668 # This part is thread-unsafe:
669 # BEGIN CRITICAL SECTION
670 x, y, z = self._seed
671 x = (171 * x) % 30269
672 y = (172 * y) % 30307
673 z = (170 * z) % 30323
674 self._seed = x, y, z
675 # END CRITICAL SECTION
676
677 # Note: on a platform using IEEE-754 double arithmetic, this can
678 # never return 0.0 (asserted by Tim; proof too long for a comment).
679 return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
680
681 def getstate(self):
682 """Return internal state; can be passed to setstate() later."""
683 return self.VERSION, self._seed, self.gauss_next
684
685 def setstate(self, state):
686 """Restore internal state from object returned by getstate()."""
687 version = state[0]
688 if version == 1:
689 version, self._seed, self.gauss_next = state
690 else:
691 raise ValueError("state with version %s passed to "
692 "Random.setstate() of version %s" %
693 (version, self.VERSION))
694
695 def jumpahead(self, n):
696 """Act as if n calls to random() were made, but quickly.
697
698 n is an int, greater than or equal to 0.
699
700 Example use: If you have 2 threads and know that each will
701 consume no more than a million random numbers, create two Random
702 objects r1 and r2, then do
703 r2.setstate(r1.getstate())
704 r2.jumpahead(1000000)
705 Then r1 and r2 will use guaranteed-disjoint segments of the full
706 period.
707 """
708
709 if not n >= 0:
710 raise ValueError("n must be >= 0")
711 x, y, z = self._seed
712 x = int(x * pow(171, n, 30269)) % 30269
713 y = int(y * pow(172, n, 30307)) % 30307
714 z = int(z * pow(170, n, 30323)) % 30323
715 self._seed = x, y, z
716
717 def __whseed(self, x=0, y=0, z=0):
718 """Set the Wichmann-Hill seed from (x, y, z).
719
720 These must be integers in the range [0, 256).
721 """
722
723 if not type(x) == type(y) == type(z) == int:
724 raise TypeError('seeds must be integers')
725 if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256):
726 raise ValueError('seeds must be in range(0, 256)')
727 if 0 == x == y == z:
728 # Initialize from current time
729 import time
730 t = long(time.time() * 256)
731 t = int((t&0xffffff) ^ (t>>24))
732 t, x = divmod(t, 256)
733 t, y = divmod(t, 256)
734 t, z = divmod(t, 256)
735 # Zero is a poor seed, so substitute 1
736 self._seed = (x or 1, y or 1, z or 1)
737
738 self.gauss_next = None
739
740 def whseed(self, a=None):
741 """Seed from hashable object's hash code.
742
743 None or no argument seeds from current time. It is not guaranteed
744 that objects with distinct hash codes lead to distinct internal
745 states.
746
747 This is obsolete, provided for compatibility with the seed routine
748 used prior to Python 2.1. Use the .seed() method instead.
749 """
750
751 if a is None:
752 self.__whseed()
753 return
754 a = hash(a)
755 a, x = divmod(a, 256)
756 a, y = divmod(a, 256)
757 a, z = divmod(a, 256)
758 x = (x + a) % 256 or 1
759 y = (y + a) % 256 or 1
760 z = (z + a) % 256 or 1
761 self.__whseed(x, y, z)
762
Raymond Hettinger23f12412004-09-13 22:23:21 +0000763## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000764
Raymond Hettinger23f12412004-09-13 22:23:21 +0000765class SystemRandom(Random):
766 """Alternate random number generator using sources provided
767 by the operating system (such as /dev/urandom on Unix or
768 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000769
770 Not available on all systems (see os.urandom() for details).
771 """
772
773 def random(self):
774 """Get the next random number in the range [0.0, 1.0)."""
Tim Peters7c2a85b2004-08-31 02:19:55 +0000775 return (long(_hexlify(_urandom(7)), 16) >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000776
777 def getrandbits(self, k):
778 """getrandbits(k) -> x. Generates a long int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000779 if k <= 0:
780 raise ValueError('number of bits must be greater than zero')
781 if k != int(k):
782 raise TypeError('number of bits should be an integer')
783 bytes = (k + 7) // 8 # bits / 8 and rounded up
784 x = long(_hexlify(_urandom(bytes)), 16)
785 return x >> (bytes * 8 - k) # trim excess bits
786
787 def _stub(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000788 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000789 return None
790 seed = jumpahead = _stub
791
792 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000793 "Method should not be called for a system random number generator."
794 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000795 getstate = setstate = _notimplemented
796
Tim Peterscd804102001-01-25 20:25:57 +0000797## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000798
Raymond Hettinger62297132003-08-30 01:24:19 +0000799def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000800 import time
Raymond Hettinger62297132003-08-30 01:24:19 +0000801 print n, 'times', func.__name__
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000802 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000803 sqsum = 0.0
804 smallest = 1e10
805 largest = -1e10
806 t0 = time.time()
807 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000808 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000809 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000810 sqsum = sqsum + x*x
811 smallest = min(x, smallest)
812 largest = max(x, largest)
813 t1 = time.time()
814 print round(t1-t0, 3), 'sec,',
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000815 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000816 stddev = _sqrt(sqsum/n - avg*avg)
Tim Peters0c9886d2001-01-15 01:18:21 +0000817 print 'avg %g, stddev %g, min %g, max %g' % \
818 (avg, stddev, smallest, largest)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000819
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000820
821def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000822 _test_generator(N, random, ())
823 _test_generator(N, normalvariate, (0.0, 1.0))
824 _test_generator(N, lognormvariate, (0.0, 1.0))
825 _test_generator(N, vonmisesvariate, (0.0, 1.0))
826 _test_generator(N, gammavariate, (0.01, 1.0))
827 _test_generator(N, gammavariate, (0.1, 1.0))
828 _test_generator(N, gammavariate, (0.1, 2.0))
829 _test_generator(N, gammavariate, (0.5, 1.0))
830 _test_generator(N, gammavariate, (0.9, 1.0))
831 _test_generator(N, gammavariate, (1.0, 1.0))
832 _test_generator(N, gammavariate, (2.0, 1.0))
833 _test_generator(N, gammavariate, (20.0, 1.0))
834 _test_generator(N, gammavariate, (200.0, 1.0))
835 _test_generator(N, gauss, (0.0, 1.0))
836 _test_generator(N, betavariate, (3.0, 3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000837
Tim Peters715c4c42001-01-26 22:56:56 +0000838# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000839# as module-level functions. The functions share state across all uses
840#(both in the user's code and in the Python libraries), but that's fine
841# for most programs and is easier for the casual user than making them
842# instantiate their own Random() instance.
843
Tim Petersd7b5e882001-01-25 03:36:26 +0000844_inst = Random()
845seed = _inst.seed
846random = _inst.random
847uniform = _inst.uniform
848randint = _inst.randint
849choice = _inst.choice
850randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000851sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000852shuffle = _inst.shuffle
853normalvariate = _inst.normalvariate
854lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000855expovariate = _inst.expovariate
856vonmisesvariate = _inst.vonmisesvariate
857gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000858gauss = _inst.gauss
859betavariate = _inst.betavariate
860paretovariate = _inst.paretovariate
861weibullvariate = _inst.weibullvariate
862getstate = _inst.getstate
863setstate = _inst.setstate
Tim Petersd52269b2001-01-25 06:23:18 +0000864jumpahead = _inst.jumpahead
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000865getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000866
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000867if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000868 _test()