blob: ad1c9167b02a65c6783260848e2713c8fc0b9f62 [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
Raymond Hettingere8f1e002016-09-06 17:15:29 -070011 pick weighted random sample
Tim Petersd7b5e882001-01-25 03:36:26 +000012 generate random permutation
13
Guido van Rossume7b146f2000-02-04 15:28:42 +000014 distributions on the real line:
15 ------------------------------
Tim Petersd7b5e882001-01-25 03:36:26 +000016 uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +000017 triangular
Guido van Rossume7b146f2000-02-04 15:28:42 +000018 normal (Gaussian)
19 lognormal
20 negative exponential
21 gamma
22 beta
Raymond Hettinger40f62172002-12-29 23:03:38 +000023 pareto
24 Weibull
Guido van Rossumff03b1a1994-03-09 12:55:02 +000025
Guido van Rossume7b146f2000-02-04 15:28:42 +000026 distributions on the circle (angles 0 to 2pi)
27 ---------------------------------------------
28 circular uniform
29 von Mises
30
Raymond Hettinger40f62172002-12-29 23:03:38 +000031General notes on the underlying Mersenne Twister core generator:
Guido van Rossume7b146f2000-02-04 15:28:42 +000032
Raymond Hettinger40f62172002-12-29 23:03:38 +000033* The period is 2**19937-1.
Thomas Wouters0e3f5912006-08-11 14:57:12 +000034* It is one of the most extensively tested generators in existence.
Thomas Wouters0e3f5912006-08-11 14:57:12 +000035* The random() method is implemented in C, executes in a single Python step,
36 and is, therefore, threadsafe.
Tim Peterse360d952001-01-26 10:00:39 +000037
Guido van Rossume7b146f2000-02-04 15:28:42 +000038"""
Guido van Rossumd03e1191998-05-29 17:51:31 +000039
Raymond Hettinger2f726e92003-10-05 09:09:15 +000040from warnings import warn as _warn
41from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
Raymond Hettinger91e27c22005-08-19 01:36:35 +000042from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
Tim Petersd7b5e882001-01-25 03:36:26 +000043from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
Raymond Hettingerc1c43ca2004-09-05 00:00:42 +000044from os import urandom as _urandom
Christian Heimesf1dc3ee2013-10-13 02:04:20 +020045from _collections_abc import Set as _Set, Sequence as _Sequence
Raymond Hettinger3fcf0022010-12-08 01:13:53 +000046from hashlib import sha512 as _sha512
Raymond Hettingere8f1e002016-09-06 17:15:29 -070047import itertools as _itertools
48import bisect as _bisect
Guido van Rossumff03b1a1994-03-09 12:55:02 +000049
Raymond Hettingerf24eb352002-11-12 17:41:57 +000050__all__ = ["Random","seed","random","uniform","randint","choice","sample",
Skip Montanaro0de65802001-02-15 22:15:14 +000051 "randrange","shuffle","normalvariate","lognormvariate",
Christian Heimesfe337bf2008-03-23 21:54:12 +000052 "expovariate","vonmisesvariate","gammavariate","triangular",
Raymond Hettingerf8a52d32003-08-05 12:23:19 +000053 "gauss","betavariate","paretovariate","weibullvariate",
Raymond Hettinger28aa4a02016-09-07 00:08:44 -070054 "getstate","setstate", "getrandbits", "choices",
Raymond Hettinger23f12412004-09-13 22:23:21 +000055 "SystemRandom"]
Tim Petersd7b5e882001-01-25 03:36:26 +000056
57NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000058TWOPI = 2.0*_pi
Tim Petersd7b5e882001-01-25 03:36:26 +000059LOG4 = _log(4.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000060SG_MAGICCONST = 1.0 + _log(4.5)
Raymond Hettinger2f726e92003-10-05 09:09:15 +000061BPF = 53 # Number of bits in a float
Tim Peters7c2a85b2004-08-31 02:19:55 +000062RECIP_BPF = 2**-BPF
Tim Petersd7b5e882001-01-25 03:36:26 +000063
Raymond Hettinger356a4592004-08-30 06:14:31 +000064
Tim Petersd7b5e882001-01-25 03:36:26 +000065# Translated by Guido van Rossum from C source provided by
Raymond Hettinger40f62172002-12-29 23:03:38 +000066# Adrian Baddeley. Adapted by Raymond Hettinger for use with
Raymond Hettinger3fa19d72004-08-31 01:05:15 +000067# the Mersenne Twister and os.urandom() core generators.
Tim Petersd7b5e882001-01-25 03:36:26 +000068
Raymond Hettinger145a4a02003-01-07 10:25:55 +000069import _random
Raymond Hettinger40f62172002-12-29 23:03:38 +000070
Raymond Hettinger145a4a02003-01-07 10:25:55 +000071class Random(_random.Random):
Raymond Hettingerc32f0332002-05-23 19:44:49 +000072 """Random number generator base class used by bound module functions.
73
74 Used to instantiate instances of Random to get generators that don't
Raymond Hettinger28de64f2008-01-13 23:40:30 +000075 share state.
Raymond Hettingerc32f0332002-05-23 19:44:49 +000076
77 Class Random can also be subclassed if you want to use a different basic
78 generator of your own devising: in that case, override the following
Raymond Hettinger28de64f2008-01-13 23:40:30 +000079 methods: random(), seed(), getstate(), and setstate().
Benjamin Petersond18de0e2008-07-31 20:21:46 +000080 Optionally, implement a getrandbits() method so that randrange()
Raymond Hettinger2f726e92003-10-05 09:09:15 +000081 can cover arbitrarily large ranges.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +000082
Raymond Hettingerc32f0332002-05-23 19:44:49 +000083 """
Tim Petersd7b5e882001-01-25 03:36:26 +000084
Christian Heimescbf3b5c2007-12-03 21:02:03 +000085 VERSION = 3 # used by getstate/setstate
Tim Petersd7b5e882001-01-25 03:36:26 +000086
87 def __init__(self, x=None):
88 """Initialize an instance.
89
90 Optional argument x controls seeding, as for Random.seed().
91 """
92
93 self.seed(x)
Raymond Hettinger40f62172002-12-29 23:03:38 +000094 self.gauss_next = None
Tim Petersd7b5e882001-01-25 03:36:26 +000095
Raymond Hettingerf763a722010-09-07 00:38:15 +000096 def seed(self, a=None, version=2):
Tim Peters0de88fc2001-02-01 04:59:18 +000097 """Initialize internal state from hashable object.
Tim Petersd7b5e882001-01-25 03:36:26 +000098
Raymond Hettinger23f12412004-09-13 22:23:21 +000099 None or no argument seeds from current time or from an operating
100 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000101
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000102 If *a* is an int, all bits are used.
Raymond Hettingerf763a722010-09-07 00:38:15 +0000103
Raymond Hettinger16eb8272016-09-04 11:17:28 -0700104 For version 2 (the default), all of the bits are used if *a* is a str,
105 bytes, or bytearray. For version 1 (provided for reproducing random
106 sequences from older versions of Python), the algorithm for str and
107 bytes generates a narrower range of seeds.
108
Tim Petersd7b5e882001-01-25 03:36:26 +0000109 """
110
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700111 if version == 1 and isinstance(a, (str, bytes)):
112 x = ord(a[0]) << 7 if a else 0
113 for c in a:
114 x = ((1000003 * x) ^ ord(c)) & 0xFFFFFFFFFFFFFFFF
115 x ^= len(a)
116 a = -2 if x == -1 else x
117
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700118 if version == 2 and isinstance(a, (str, bytes, bytearray)):
119 if isinstance(a, str):
120 a = a.encode()
121 a += _sha512(a).digest()
122 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000123
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000124 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000125 self.gauss_next = None
126
Tim Peterscd804102001-01-25 20:25:57 +0000127 def getstate(self):
128 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000129 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000130
131 def setstate(self, state):
132 """Restore internal state from object returned by getstate()."""
133 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000134 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000135 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000136 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000137 elif version == 2:
138 version, internalstate, self.gauss_next = state
139 # In version 2, the state was saved as signed ints, which causes
140 # inconsistencies between 32/64-bit systems. The state is
141 # really unsigned 32-bit ints, so we convert negative ints from
142 # version 2 to positive longs for version 3.
143 try:
Raymond Hettingerc585eec2010-09-07 15:00:15 +0000144 internalstate = tuple(x % (2**32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000145 except ValueError as e:
146 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000147 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000148 else:
149 raise ValueError("state with version %s passed to "
150 "Random.setstate() of version %s" %
151 (version, self.VERSION))
152
Tim Peterscd804102001-01-25 20:25:57 +0000153## ---- Methods below this point do not need to be overridden when
154## ---- subclassing for the purpose of using a different core generator.
155
156## -------------------- pickle support -------------------
157
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400158 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
159 # longer called; we leave it here because it has been here since random was
160 # rewritten back in 2001 and why risk breaking something.
Tim Peterscd804102001-01-25 20:25:57 +0000161 def __getstate__(self): # for pickle
162 return self.getstate()
163
164 def __setstate__(self, state): # for pickle
165 self.setstate(state)
166
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000167 def __reduce__(self):
168 return self.__class__, (), self.getstate()
169
Tim Peterscd804102001-01-25 20:25:57 +0000170## -------------------- integer methods -------------------
171
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700172 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000173 """Choose a random item from range(start, stop[, step]).
174
175 This fixes the problem with randint() which includes the
176 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000177
Tim Petersd7b5e882001-01-25 03:36:26 +0000178 """
179
180 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000181 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700182 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000183 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000184 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000185 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000186 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000187 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000188 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000189
190 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700191 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000192 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000193 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000194 width = istop - istart
195 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000196 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000197 if step == 1:
Collin Winterce36ad82007-08-30 01:19:48 +0000198 raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000199
200 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700201 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000202 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000203 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000204 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000205 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000206 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000207 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000208 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000209 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000210
211 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000212 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000213
Raymond Hettinger05156612010-09-07 04:44:52 +0000214 return istart + istep*self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000215
216 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000217 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000218 """
219
220 return self.randrange(a, b+1)
221
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000222 def _randbelow(self, n, int=int, maxsize=1<<BPF, type=type,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000223 Method=_MethodType, BuiltinMethod=_BuiltinMethodType):
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000224 "Return a random int in the range [0,n). Raises ValueError if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000225
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700226 random = self.random
Raymond Hettingerc3246972010-09-07 09:32:57 +0000227 getrandbits = self.getrandbits
228 # Only call self.getrandbits if the original random() builtin method
229 # has not been overridden or if a new getrandbits() was supplied.
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700230 if type(random) is BuiltinMethod or type(getrandbits) is Method:
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000231 k = n.bit_length() # don't use (n-1) here because n can be 1
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000232 r = getrandbits(k) # 0 <= r < 2**k
Raymond Hettingerc3246972010-09-07 09:32:57 +0000233 while r >= n:
234 r = getrandbits(k)
235 return r
Martin Pantere26da7c2016-06-02 10:07:09 +0000236 # There's an overridden random() method but no new getrandbits() method,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000237 # so we can only use random() from here.
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000238 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000239 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000240 "enough bits to choose from a population range this large.\n"
241 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000242 return int(random() * n)
243 rem = maxsize % n
244 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
245 r = random()
246 while r >= limit:
247 r = random()
248 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000249
Tim Peterscd804102001-01-25 20:25:57 +0000250## -------------------- sequence methods -------------------
251
Tim Petersd7b5e882001-01-25 03:36:26 +0000252 def choice(self, seq):
253 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000254 try:
255 i = self._randbelow(len(seq))
256 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800257 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000258 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000259
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700260 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100261 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000262
Antoine Pitrou5e394332012-11-04 02:10:33 +0100263 Optional argument random is a 0-argument function returning a
264 random float in [0.0, 1.0); if it is the default None, the
265 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700266
Tim Petersd7b5e882001-01-25 03:36:26 +0000267 """
268
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700269 if random is None:
270 randbelow = self._randbelow
271 for i in reversed(range(1, len(x))):
272 # pick an element in x[:i+1] with which to exchange x[i]
273 j = randbelow(i+1)
274 x[i], x[j] = x[j], x[i]
275 else:
276 _int = int
277 for i in reversed(range(1, len(x))):
278 # pick an element in x[:i+1] with which to exchange x[i]
279 j = _int(random() * (i+1))
280 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000281
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000282 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000283 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000284
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000285 Returns a new list containing elements from the population while
286 leaving the original population unchanged. The resulting list is
287 in selection order so that all sub-slices will also be valid random
288 samples. This allows raffle winners (the sample) to be partitioned
289 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000290
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000291 Members of the population need not be hashable or unique. If the
292 population contains repeats, then each occurrence is a possible
293 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000294
Guido van Rossum805365e2007-05-07 22:24:25 +0000295 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000296 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000297 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000298 """
299
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000300 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000301 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000302
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000303 # When the number of selections is small compared to the
304 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000305 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000306 # a larger number of selections, the pool tracking method is
307 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000308 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000309
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000310 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000311 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000312 if not isinstance(population, _Sequence):
313 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000314 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000315 n = len(population)
316 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800317 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000318 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000319 setsize = 21 # size of a small set minus size of an empty list
320 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000321 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000322 if n <= setsize:
323 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000324 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000325 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000326 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000327 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000328 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000329 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000330 selected = set()
331 selected_add = selected.add
332 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000333 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000334 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000335 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000336 selected_add(j)
337 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000338 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000339
Raymond Hettinger9016f282016-09-26 21:45:57 -0700340 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700341 """Return a k sized list of population elements chosen with replacement.
342
343 If the relative weights or cumulative weights are not specified,
344 the selections are made with equal probability.
345
346 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700347 random = self.random
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700348 if cum_weights is None:
349 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700350 _int = int
351 total = len(population)
352 return [population[_int(random() * total)] for i in range(k)]
Raymond Hettinger8567e582016-11-01 22:23:11 -0700353 cum_weights = list(_itertools.accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700354 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500355 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700356 if len(cum_weights) != len(population):
357 raise ValueError('The number of weights does not match the population')
358 bisect = _bisect.bisect
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700359 total = cum_weights[-1]
360 return [population[bisect(cum_weights, random() * total)] for i in range(k)]
361
Tim Peterscd804102001-01-25 20:25:57 +0000362## -------------------- real-valued distributions -------------------
363
364## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000365
366 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000367 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000368 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000369
Christian Heimesfe337bf2008-03-23 21:54:12 +0000370## -------------------- triangular --------------------
371
372 def triangular(self, low=0.0, high=1.0, mode=None):
373 """Triangular distribution.
374
375 Continuous distribution bounded by given lower and upper limits,
376 and having a given mode value in-between.
377
378 http://en.wikipedia.org/wiki/Triangular_distribution
379
380 """
381 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700382 try:
383 c = 0.5 if mode is None else (mode - low) / (high - low)
384 except ZeroDivisionError:
385 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000386 if u > c:
387 u = 1.0 - u
388 c = 1.0 - c
389 low, high = high, low
390 return low + (high - low) * (u * c) ** 0.5
391
Tim Peterscd804102001-01-25 20:25:57 +0000392## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000393
Tim Petersd7b5e882001-01-25 03:36:26 +0000394 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000395 """Normal distribution.
396
397 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000398
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000399 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000400 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000401
Tim Petersd7b5e882001-01-25 03:36:26 +0000402 # Uses Kinderman and Monahan method. Reference: Kinderman,
403 # A.J. and Monahan, J.F., "Computer generation of random
404 # variables using the ratio of uniform deviates", ACM Trans
405 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000406
Tim Petersd7b5e882001-01-25 03:36:26 +0000407 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000408 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000409 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000410 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000411 z = NV_MAGICCONST*(u1-0.5)/u2
412 zz = z*z/4.0
413 if zz <= -_log(u2):
414 break
415 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000416
Tim Peterscd804102001-01-25 20:25:57 +0000417## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000418
419 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000420 """Log normal distribution.
421
422 If you take the natural logarithm of this distribution, you'll get a
423 normal distribution with mean mu and standard deviation sigma.
424 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000425
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000426 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000427 return _exp(self.normalvariate(mu, sigma))
428
Tim Peterscd804102001-01-25 20:25:57 +0000429## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000430
431 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000432 """Exponential distribution.
433
Mark Dickinson2f947362009-01-07 17:54:07 +0000434 lambd is 1.0 divided by the desired mean. It should be
435 nonzero. (The parameter would be called "lambda", but that is
436 a reserved word in Python.) Returned values range from 0 to
437 positive infinity if lambd is positive, and from negative
438 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000439
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000440 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000441 # lambd: rate lambd = 1/mean
442 # ('lambda' is a Python reserved word)
443
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200444 # we use 1-random() instead of random() to preclude the
445 # possibility of taking the log of zero.
446 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000447
Tim Peterscd804102001-01-25 20:25:57 +0000448## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000449
Tim Petersd7b5e882001-01-25 03:36:26 +0000450 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000451 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000452
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000453 mu is the mean angle, expressed in radians between 0 and 2*pi, and
454 kappa is the concentration parameter, which must be greater than or
455 equal to zero. If kappa is equal to zero, this distribution reduces
456 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000457
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000458 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000459 # mu: mean angle (in radians between 0 and 2*pi)
460 # kappa: concentration parameter kappa (>= 0)
461 # if kappa = 0 generate uniform random angle
462
463 # Based upon an algorithm published in: Fisher, N.I.,
464 # "Statistical Analysis of Circular Data", Cambridge
465 # University Press, 1993.
466
467 # Thanks to Magnus Kessler for a correction to the
468 # implementation of step 4.
469
470 random = self.random
471 if kappa <= 1e-6:
472 return TWOPI * random()
473
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200474 s = 0.5 / kappa
475 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000476
Raymond Hettinger42406e62005-04-30 09:02:51 +0000477 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000478 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000479 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000480
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200481 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000482 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200483 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000484 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000485
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200486 q = 1.0 / r
487 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000488 u3 = random()
489 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000490 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000491 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000492 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000493
494 return theta
495
Tim Peterscd804102001-01-25 20:25:57 +0000496## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000497
498 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000499 """Gamma distribution. Not the gamma function!
500
501 Conditions on the parameters are alpha > 0 and beta > 0.
502
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700503 The probability distribution function is:
504
505 x ** (alpha - 1) * math.exp(-x / beta)
506 pdf(x) = --------------------------------------
507 math.gamma(alpha) * beta ** alpha
508
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000509 """
Tim Peters8ac14952002-05-23 15:15:30 +0000510
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000511 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000512
Guido van Rossum570764d2002-05-14 14:08:12 +0000513 # Warning: a few older sources define the gamma distribution in terms
514 # of alpha > -1.0
515 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000516 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000517
Tim Petersd7b5e882001-01-25 03:36:26 +0000518 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000519 if alpha > 1.0:
520
521 # Uses R.C.H. Cheng, "The generation of Gamma
522 # variables with non-integral shape parameters",
523 # Applied Statistics, (1977), 26, No. 1, p71-74
524
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000525 ainv = _sqrt(2.0 * alpha - 1.0)
526 bbb = alpha - LOG4
527 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000528
Raymond Hettinger42406e62005-04-30 09:02:51 +0000529 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000530 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000531 if not 1e-7 < u1 < .9999999:
532 continue
533 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000534 v = _log(u1/(1.0-u1))/ainv
535 x = alpha*_exp(v)
536 z = u1*u1*u2
537 r = bbb+ccc*v-x
538 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000539 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000540
541 elif alpha == 1.0:
542 # expovariate(1)
543 u = random()
544 while u <= 1e-7:
545 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000546 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000547
548 else: # alpha is between 0 and 1 (exclusive)
549
550 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
551
Raymond Hettinger42406e62005-04-30 09:02:51 +0000552 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000553 u = random()
554 b = (_e + alpha)/_e
555 p = b*u
556 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000557 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000558 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000559 x = -_log((b-p)/alpha)
560 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000561 if p > 1.0:
562 if u1 <= x ** (alpha - 1.0):
563 break
564 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000565 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000566 return x * beta
567
Tim Peterscd804102001-01-25 20:25:57 +0000568## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000569
Tim Petersd7b5e882001-01-25 03:36:26 +0000570 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000571 """Gaussian distribution.
572
573 mu is the mean, and sigma is the standard deviation. This is
574 slightly faster than the normalvariate() function.
575
576 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000577
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000578 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000579
Tim Petersd7b5e882001-01-25 03:36:26 +0000580 # When x and y are two variables from [0, 1), uniformly
581 # distributed, then
582 #
583 # cos(2*pi*x)*sqrt(-2*log(1-y))
584 # sin(2*pi*x)*sqrt(-2*log(1-y))
585 #
586 # are two *independent* variables with normal distribution
587 # (mu = 0, sigma = 1).
588 # (Lambert Meertens)
589 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000590
Tim Petersd7b5e882001-01-25 03:36:26 +0000591 # Multithreading note: When two threads call this function
592 # simultaneously, it is possible that they will receive the
593 # same return value. The window is very small though. To
594 # avoid this, you have to use a lock around all calls. (I
595 # didn't want to slow this down in the serial case by using a
596 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000597
Tim Petersd7b5e882001-01-25 03:36:26 +0000598 random = self.random
599 z = self.gauss_next
600 self.gauss_next = None
601 if z is None:
602 x2pi = random() * TWOPI
603 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
604 z = _cos(x2pi) * g2rad
605 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000606
Tim Petersd7b5e882001-01-25 03:36:26 +0000607 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000608
Tim Peterscd804102001-01-25 20:25:57 +0000609## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000610## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300611## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000612## for Ivan Frohne's insightful analysis of why the original implementation:
613##
614## def betavariate(self, alpha, beta):
615## # Discrete Event Simulation in C, pp 87-88.
616##
617## y = self.expovariate(alpha)
618## z = self.expovariate(1.0/beta)
619## return z/(y+z)
620##
621## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000622
Tim Petersd7b5e882001-01-25 03:36:26 +0000623 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000624 """Beta distribution.
625
Thomas Woutersb2137042007-02-01 18:02:27 +0000626 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000627 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000628
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000629 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000630
Tim Peters85e2e472001-01-26 06:49:56 +0000631 # This version due to Janne Sinkkonen, and matches all the std
632 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300633 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000634 if y == 0:
635 return 0.0
636 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300637 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000638
Tim Peterscd804102001-01-25 20:25:57 +0000639## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000640
Tim Petersd7b5e882001-01-25 03:36:26 +0000641 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000642 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000643 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000644
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000645 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000646 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000647
Tim Peterscd804102001-01-25 20:25:57 +0000648## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000649
Tim Petersd7b5e882001-01-25 03:36:26 +0000650 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000651 """Weibull distribution.
652
653 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000654
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000655 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000656 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000657
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000658 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000659 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000660
Raymond Hettinger23f12412004-09-13 22:23:21 +0000661## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000662
Raymond Hettinger23f12412004-09-13 22:23:21 +0000663class SystemRandom(Random):
664 """Alternate random number generator using sources provided
665 by the operating system (such as /dev/urandom on Unix or
666 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000667
668 Not available on all systems (see os.urandom() for details).
669 """
670
671 def random(self):
672 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000673 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000674
675 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300676 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000677 if k <= 0:
678 raise ValueError('number of bits must be greater than zero')
679 if k != int(k):
680 raise TypeError('number of bits should be an integer')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000681 numbytes = (k + 7) // 8 # bits / 8 and rounded up
682 x = int.from_bytes(_urandom(numbytes), 'big')
683 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000684
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000685 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000686 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000687 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000688
689 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000690 "Method should not be called for a system random number generator."
691 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000692 getstate = setstate = _notimplemented
693
Tim Peterscd804102001-01-25 20:25:57 +0000694## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000695
Raymond Hettinger62297132003-08-30 01:24:19 +0000696def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000697 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000698 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000699 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000700 sqsum = 0.0
701 smallest = 1e10
702 largest = -1e10
703 t0 = time.time()
704 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000705 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000706 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000707 sqsum = sqsum + x*x
708 smallest = min(x, smallest)
709 largest = max(x, largest)
710 t1 = time.time()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000711 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000712 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000713 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100714 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000715 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000716
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000717
718def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000719 _test_generator(N, random, ())
720 _test_generator(N, normalvariate, (0.0, 1.0))
721 _test_generator(N, lognormvariate, (0.0, 1.0))
722 _test_generator(N, vonmisesvariate, (0.0, 1.0))
723 _test_generator(N, gammavariate, (0.01, 1.0))
724 _test_generator(N, gammavariate, (0.1, 1.0))
725 _test_generator(N, gammavariate, (0.1, 2.0))
726 _test_generator(N, gammavariate, (0.5, 1.0))
727 _test_generator(N, gammavariate, (0.9, 1.0))
728 _test_generator(N, gammavariate, (1.0, 1.0))
729 _test_generator(N, gammavariate, (2.0, 1.0))
730 _test_generator(N, gammavariate, (20.0, 1.0))
731 _test_generator(N, gammavariate, (200.0, 1.0))
732 _test_generator(N, gauss, (0.0, 1.0))
733 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000734 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000735
Tim Peters715c4c42001-01-26 22:56:56 +0000736# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000737# as module-level functions. The functions share state across all uses
738#(both in the user's code and in the Python libraries), but that's fine
739# for most programs and is easier for the casual user than making them
740# instantiate their own Random() instance.
741
Tim Petersd7b5e882001-01-25 03:36:26 +0000742_inst = Random()
743seed = _inst.seed
744random = _inst.random
745uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000746triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000747randint = _inst.randint
748choice = _inst.choice
749randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000750sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000751shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700752choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000753normalvariate = _inst.normalvariate
754lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000755expovariate = _inst.expovariate
756vonmisesvariate = _inst.vonmisesvariate
757gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000758gauss = _inst.gauss
759betavariate = _inst.betavariate
760paretovariate = _inst.paretovariate
761weibullvariate = _inst.weibullvariate
762getstate = _inst.getstate
763setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000764getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000765
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000766if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000767 _test()