blob: 0bc24174e13f14f65c2dbe8d05379d0ae4b34a3b [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
Antoine Pitrou346cbd32017-05-27 17:50:54 +020049import os as _os
Guido van Rossumff03b1a1994-03-09 12:55:02 +000050
Raymond Hettingerf24eb352002-11-12 17:41:57 +000051__all__ = ["Random","seed","random","uniform","randint","choice","sample",
Skip Montanaro0de65802001-02-15 22:15:14 +000052 "randrange","shuffle","normalvariate","lognormvariate",
Christian Heimesfe337bf2008-03-23 21:54:12 +000053 "expovariate","vonmisesvariate","gammavariate","triangular",
Raymond Hettingerf8a52d32003-08-05 12:23:19 +000054 "gauss","betavariate","paretovariate","weibullvariate",
Raymond Hettinger28aa4a02016-09-07 00:08:44 -070055 "getstate","setstate", "getrandbits", "choices",
Raymond Hettinger23f12412004-09-13 22:23:21 +000056 "SystemRandom"]
Tim Petersd7b5e882001-01-25 03:36:26 +000057
58NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000059TWOPI = 2.0*_pi
Tim Petersd7b5e882001-01-25 03:36:26 +000060LOG4 = _log(4.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000061SG_MAGICCONST = 1.0 + _log(4.5)
Raymond Hettinger2f726e92003-10-05 09:09:15 +000062BPF = 53 # Number of bits in a float
Tim Peters7c2a85b2004-08-31 02:19:55 +000063RECIP_BPF = 2**-BPF
Tim Petersd7b5e882001-01-25 03:36:26 +000064
Raymond Hettinger356a4592004-08-30 06:14:31 +000065
Tim Petersd7b5e882001-01-25 03:36:26 +000066# Translated by Guido van Rossum from C source provided by
Raymond Hettinger40f62172002-12-29 23:03:38 +000067# Adrian Baddeley. Adapted by Raymond Hettinger for use with
Raymond Hettinger3fa19d72004-08-31 01:05:15 +000068# the Mersenne Twister and os.urandom() core generators.
Tim Petersd7b5e882001-01-25 03:36:26 +000069
Raymond Hettinger145a4a02003-01-07 10:25:55 +000070import _random
Raymond Hettinger40f62172002-12-29 23:03:38 +000071
Raymond Hettinger145a4a02003-01-07 10:25:55 +000072class Random(_random.Random):
Raymond Hettingerc32f0332002-05-23 19:44:49 +000073 """Random number generator base class used by bound module functions.
74
75 Used to instantiate instances of Random to get generators that don't
Raymond Hettinger28de64f2008-01-13 23:40:30 +000076 share state.
Raymond Hettingerc32f0332002-05-23 19:44:49 +000077
78 Class Random can also be subclassed if you want to use a different basic
79 generator of your own devising: in that case, override the following
Raymond Hettinger28de64f2008-01-13 23:40:30 +000080 methods: random(), seed(), getstate(), and setstate().
Benjamin Petersond18de0e2008-07-31 20:21:46 +000081 Optionally, implement a getrandbits() method so that randrange()
Raymond Hettinger2f726e92003-10-05 09:09:15 +000082 can cover arbitrarily large ranges.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +000083
Raymond Hettingerc32f0332002-05-23 19:44:49 +000084 """
Tim Petersd7b5e882001-01-25 03:36:26 +000085
Christian Heimescbf3b5c2007-12-03 21:02:03 +000086 VERSION = 3 # used by getstate/setstate
Tim Petersd7b5e882001-01-25 03:36:26 +000087
88 def __init__(self, x=None):
89 """Initialize an instance.
90
91 Optional argument x controls seeding, as for Random.seed().
92 """
93
94 self.seed(x)
Raymond Hettinger40f62172002-12-29 23:03:38 +000095 self.gauss_next = None
Tim Petersd7b5e882001-01-25 03:36:26 +000096
Raymond Hettingerf763a722010-09-07 00:38:15 +000097 def seed(self, a=None, version=2):
Tim Peters0de88fc2001-02-01 04:59:18 +000098 """Initialize internal state from hashable object.
Tim Petersd7b5e882001-01-25 03:36:26 +000099
Raymond Hettinger23f12412004-09-13 22:23:21 +0000100 None or no argument seeds from current time or from an operating
101 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000102
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000103 If *a* is an int, all bits are used.
Raymond Hettingerf763a722010-09-07 00:38:15 +0000104
Raymond Hettinger16eb8272016-09-04 11:17:28 -0700105 For version 2 (the default), all of the bits are used if *a* is a str,
106 bytes, or bytearray. For version 1 (provided for reproducing random
107 sequences from older versions of Python), the algorithm for str and
108 bytes generates a narrower range of seeds.
109
Tim Petersd7b5e882001-01-25 03:36:26 +0000110 """
111
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700112 if version == 1 and isinstance(a, (str, bytes)):
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700113 a = a.decode('latin-1') if isinstance(a, bytes) else a
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700114 x = ord(a[0]) << 7 if a else 0
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700115 for c in map(ord, a):
116 x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700117 x ^= len(a)
118 a = -2 if x == -1 else x
119
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700120 if version == 2 and isinstance(a, (str, bytes, bytearray)):
121 if isinstance(a, str):
122 a = a.encode()
123 a += _sha512(a).digest()
124 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000125
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000126 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000127 self.gauss_next = None
128
Tim Peterscd804102001-01-25 20:25:57 +0000129 def getstate(self):
130 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000131 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000132
133 def setstate(self, state):
134 """Restore internal state from object returned by getstate()."""
135 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000136 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000137 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000138 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000139 elif version == 2:
140 version, internalstate, self.gauss_next = state
141 # In version 2, the state was saved as signed ints, which causes
142 # inconsistencies between 32/64-bit systems. The state is
143 # really unsigned 32-bit ints, so we convert negative ints from
144 # version 2 to positive longs for version 3.
145 try:
Raymond Hettingerc585eec2010-09-07 15:00:15 +0000146 internalstate = tuple(x % (2**32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000147 except ValueError as e:
148 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000149 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000150 else:
151 raise ValueError("state with version %s passed to "
152 "Random.setstate() of version %s" %
153 (version, self.VERSION))
154
Tim Peterscd804102001-01-25 20:25:57 +0000155## ---- Methods below this point do not need to be overridden when
156## ---- subclassing for the purpose of using a different core generator.
157
158## -------------------- pickle support -------------------
159
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400160 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
161 # longer called; we leave it here because it has been here since random was
162 # rewritten back in 2001 and why risk breaking something.
Tim Peterscd804102001-01-25 20:25:57 +0000163 def __getstate__(self): # for pickle
164 return self.getstate()
165
166 def __setstate__(self, state): # for pickle
167 self.setstate(state)
168
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000169 def __reduce__(self):
170 return self.__class__, (), self.getstate()
171
Tim Peterscd804102001-01-25 20:25:57 +0000172## -------------------- integer methods -------------------
173
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700174 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000175 """Choose a random item from range(start, stop[, step]).
176
177 This fixes the problem with randint() which includes the
178 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000179
Tim Petersd7b5e882001-01-25 03:36:26 +0000180 """
181
182 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000183 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700184 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000185 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000186 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000187 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000188 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000189 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000190 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000191
192 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700193 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000194 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000195 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000196 width = istop - istart
197 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000198 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000199 if step == 1:
Collin Winterce36ad82007-08-30 01:19:48 +0000200 raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000201
202 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700203 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000204 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000205 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000206 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000207 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000208 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000209 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000210 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000211 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000212
213 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000214 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000215
Raymond Hettinger05156612010-09-07 04:44:52 +0000216 return istart + istep*self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000217
218 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000219 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000220 """
221
222 return self.randrange(a, b+1)
223
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000224 def _randbelow(self, n, int=int, maxsize=1<<BPF, type=type,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000225 Method=_MethodType, BuiltinMethod=_BuiltinMethodType):
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000226 "Return a random int in the range [0,n). Raises ValueError if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000227
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700228 random = self.random
Raymond Hettingerc3246972010-09-07 09:32:57 +0000229 getrandbits = self.getrandbits
230 # Only call self.getrandbits if the original random() builtin method
231 # has not been overridden or if a new getrandbits() was supplied.
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700232 if type(random) is BuiltinMethod or type(getrandbits) is Method:
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000233 k = n.bit_length() # don't use (n-1) here because n can be 1
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000234 r = getrandbits(k) # 0 <= r < 2**k
Raymond Hettingerc3246972010-09-07 09:32:57 +0000235 while r >= n:
236 r = getrandbits(k)
237 return r
Martin Pantere26da7c2016-06-02 10:07:09 +0000238 # There's an overridden random() method but no new getrandbits() method,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000239 # so we can only use random() from here.
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000240 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000241 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000242 "enough bits to choose from a population range this large.\n"
243 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000244 return int(random() * n)
Miss Islington (bot)baf304e2018-04-05 09:02:12 -0700245 if n == 0:
246 raise ValueError("Boundary cannot be zero")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000247 rem = maxsize % n
248 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
249 r = random()
250 while r >= limit:
251 r = random()
252 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000253
Tim Peterscd804102001-01-25 20:25:57 +0000254## -------------------- sequence methods -------------------
255
Tim Petersd7b5e882001-01-25 03:36:26 +0000256 def choice(self, seq):
257 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000258 try:
259 i = self._randbelow(len(seq))
260 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800261 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000262 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000263
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700264 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100265 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000266
Antoine Pitrou5e394332012-11-04 02:10:33 +0100267 Optional argument random is a 0-argument function returning a
268 random float in [0.0, 1.0); if it is the default None, the
269 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700270
Tim Petersd7b5e882001-01-25 03:36:26 +0000271 """
272
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700273 if random is None:
274 randbelow = self._randbelow
275 for i in reversed(range(1, len(x))):
276 # pick an element in x[:i+1] with which to exchange x[i]
277 j = randbelow(i+1)
278 x[i], x[j] = x[j], x[i]
279 else:
280 _int = int
281 for i in reversed(range(1, len(x))):
282 # pick an element in x[:i+1] with which to exchange x[i]
283 j = _int(random() * (i+1))
284 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000285
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000286 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000287 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000288
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000289 Returns a new list containing elements from the population while
290 leaving the original population unchanged. The resulting list is
291 in selection order so that all sub-slices will also be valid random
292 samples. This allows raffle winners (the sample) to be partitioned
293 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000294
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000295 Members of the population need not be hashable or unique. If the
296 population contains repeats, then each occurrence is a possible
297 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000298
Guido van Rossum805365e2007-05-07 22:24:25 +0000299 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000300 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000301 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000302 """
303
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000304 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000305 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000306
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000307 # When the number of selections is small compared to the
308 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000309 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000310 # a larger number of selections, the pool tracking method is
311 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000312 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000313
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000314 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000315 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000316 if not isinstance(population, _Sequence):
317 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000318 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000319 n = len(population)
320 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800321 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000322 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000323 setsize = 21 # size of a small set minus size of an empty list
324 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000325 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000326 if n <= setsize:
327 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000328 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000329 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000330 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000331 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000332 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000333 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000334 selected = set()
335 selected_add = selected.add
336 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000337 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000338 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000339 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000340 selected_add(j)
341 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000342 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000343
Raymond Hettinger9016f282016-09-26 21:45:57 -0700344 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700345 """Return a k sized list of population elements chosen with replacement.
346
347 If the relative weights or cumulative weights are not specified,
348 the selections are made with equal probability.
349
350 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700351 random = self.random
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700352 if cum_weights is None:
353 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700354 _int = int
355 total = len(population)
356 return [population[_int(random() * total)] for i in range(k)]
Raymond Hettinger8567e582016-11-01 22:23:11 -0700357 cum_weights = list(_itertools.accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700358 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500359 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700360 if len(cum_weights) != len(population):
361 raise ValueError('The number of weights does not match the population')
362 bisect = _bisect.bisect
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700363 total = cum_weights[-1]
364 return [population[bisect(cum_weights, random() * total)] for i in range(k)]
365
Tim Peterscd804102001-01-25 20:25:57 +0000366## -------------------- real-valued distributions -------------------
367
368## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000369
370 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000371 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000372 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000373
Christian Heimesfe337bf2008-03-23 21:54:12 +0000374## -------------------- triangular --------------------
375
376 def triangular(self, low=0.0, high=1.0, mode=None):
377 """Triangular distribution.
378
379 Continuous distribution bounded by given lower and upper limits,
380 and having a given mode value in-between.
381
382 http://en.wikipedia.org/wiki/Triangular_distribution
383
384 """
385 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700386 try:
387 c = 0.5 if mode is None else (mode - low) / (high - low)
388 except ZeroDivisionError:
389 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000390 if u > c:
391 u = 1.0 - u
392 c = 1.0 - c
393 low, high = high, low
Raymond Hettingerf5ea83f2017-09-04 16:51:06 -0700394 return low + (high - low) * _sqrt(u * c)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000395
Tim Peterscd804102001-01-25 20:25:57 +0000396## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000397
Tim Petersd7b5e882001-01-25 03:36:26 +0000398 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000399 """Normal distribution.
400
401 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000402
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000403 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000404 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000405
Tim Petersd7b5e882001-01-25 03:36:26 +0000406 # Uses Kinderman and Monahan method. Reference: Kinderman,
407 # A.J. and Monahan, J.F., "Computer generation of random
408 # variables using the ratio of uniform deviates", ACM Trans
409 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000410
Tim Petersd7b5e882001-01-25 03:36:26 +0000411 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000412 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000413 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000414 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000415 z = NV_MAGICCONST*(u1-0.5)/u2
416 zz = z*z/4.0
417 if zz <= -_log(u2):
418 break
419 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000420
Tim Peterscd804102001-01-25 20:25:57 +0000421## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000422
423 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000424 """Log normal distribution.
425
426 If you take the natural logarithm of this distribution, you'll get a
427 normal distribution with mean mu and standard deviation sigma.
428 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000429
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000430 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000431 return _exp(self.normalvariate(mu, sigma))
432
Tim Peterscd804102001-01-25 20:25:57 +0000433## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000434
435 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000436 """Exponential distribution.
437
Mark Dickinson2f947362009-01-07 17:54:07 +0000438 lambd is 1.0 divided by the desired mean. It should be
439 nonzero. (The parameter would be called "lambda", but that is
440 a reserved word in Python.) Returned values range from 0 to
441 positive infinity if lambd is positive, and from negative
442 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000443
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000444 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000445 # lambd: rate lambd = 1/mean
446 # ('lambda' is a Python reserved word)
447
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200448 # we use 1-random() instead of random() to preclude the
449 # possibility of taking the log of zero.
450 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000451
Tim Peterscd804102001-01-25 20:25:57 +0000452## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000453
Tim Petersd7b5e882001-01-25 03:36:26 +0000454 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000455 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000456
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000457 mu is the mean angle, expressed in radians between 0 and 2*pi, and
458 kappa is the concentration parameter, which must be greater than or
459 equal to zero. If kappa is equal to zero, this distribution reduces
460 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000461
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000462 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000463 # mu: mean angle (in radians between 0 and 2*pi)
464 # kappa: concentration parameter kappa (>= 0)
465 # if kappa = 0 generate uniform random angle
466
467 # Based upon an algorithm published in: Fisher, N.I.,
468 # "Statistical Analysis of Circular Data", Cambridge
469 # University Press, 1993.
470
471 # Thanks to Magnus Kessler for a correction to the
472 # implementation of step 4.
473
474 random = self.random
475 if kappa <= 1e-6:
476 return TWOPI * random()
477
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200478 s = 0.5 / kappa
479 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000480
Raymond Hettinger42406e62005-04-30 09:02:51 +0000481 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000482 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000483 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000484
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200485 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000486 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200487 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000488 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000489
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200490 q = 1.0 / r
491 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000492 u3 = random()
493 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000494 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000495 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000496 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000497
498 return theta
499
Tim Peterscd804102001-01-25 20:25:57 +0000500## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000501
502 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000503 """Gamma distribution. Not the gamma function!
504
505 Conditions on the parameters are alpha > 0 and beta > 0.
506
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700507 The probability distribution function is:
508
509 x ** (alpha - 1) * math.exp(-x / beta)
510 pdf(x) = --------------------------------------
511 math.gamma(alpha) * beta ** alpha
512
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000513 """
Tim Peters8ac14952002-05-23 15:15:30 +0000514
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000515 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000516
Guido van Rossum570764d2002-05-14 14:08:12 +0000517 # Warning: a few older sources define the gamma distribution in terms
518 # of alpha > -1.0
519 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000520 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000521
Tim Petersd7b5e882001-01-25 03:36:26 +0000522 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000523 if alpha > 1.0:
524
525 # Uses R.C.H. Cheng, "The generation of Gamma
526 # variables with non-integral shape parameters",
527 # Applied Statistics, (1977), 26, No. 1, p71-74
528
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000529 ainv = _sqrt(2.0 * alpha - 1.0)
530 bbb = alpha - LOG4
531 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000532
Raymond Hettinger42406e62005-04-30 09:02:51 +0000533 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000534 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000535 if not 1e-7 < u1 < .9999999:
536 continue
537 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000538 v = _log(u1/(1.0-u1))/ainv
539 x = alpha*_exp(v)
540 z = u1*u1*u2
541 r = bbb+ccc*v-x
542 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000543 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000544
545 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100546 # expovariate(1/beta)
Tim Petersd7b5e882001-01-25 03:36:26 +0000547 u = random()
548 while u <= 1e-7:
549 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000550 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000551
552 else: # alpha is between 0 and 1 (exclusive)
553
554 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
555
Raymond Hettinger42406e62005-04-30 09:02:51 +0000556 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000557 u = random()
558 b = (_e + alpha)/_e
559 p = b*u
560 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000561 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000562 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000563 x = -_log((b-p)/alpha)
564 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000565 if p > 1.0:
566 if u1 <= x ** (alpha - 1.0):
567 break
568 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000569 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000570 return x * beta
571
Tim Peterscd804102001-01-25 20:25:57 +0000572## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000573
Tim Petersd7b5e882001-01-25 03:36:26 +0000574 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000575 """Gaussian distribution.
576
577 mu is the mean, and sigma is the standard deviation. This is
578 slightly faster than the normalvariate() function.
579
580 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000581
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000582 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000583
Tim Petersd7b5e882001-01-25 03:36:26 +0000584 # When x and y are two variables from [0, 1), uniformly
585 # distributed, then
586 #
587 # cos(2*pi*x)*sqrt(-2*log(1-y))
588 # sin(2*pi*x)*sqrt(-2*log(1-y))
589 #
590 # are two *independent* variables with normal distribution
591 # (mu = 0, sigma = 1).
592 # (Lambert Meertens)
593 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000594
Tim Petersd7b5e882001-01-25 03:36:26 +0000595 # Multithreading note: When two threads call this function
596 # simultaneously, it is possible that they will receive the
597 # same return value. The window is very small though. To
598 # avoid this, you have to use a lock around all calls. (I
599 # didn't want to slow this down in the serial case by using a
600 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000601
Tim Petersd7b5e882001-01-25 03:36:26 +0000602 random = self.random
603 z = self.gauss_next
604 self.gauss_next = None
605 if z is None:
606 x2pi = random() * TWOPI
607 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
608 z = _cos(x2pi) * g2rad
609 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000610
Tim Petersd7b5e882001-01-25 03:36:26 +0000611 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000612
Tim Peterscd804102001-01-25 20:25:57 +0000613## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000614## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300615## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000616## for Ivan Frohne's insightful analysis of why the original implementation:
617##
618## def betavariate(self, alpha, beta):
619## # Discrete Event Simulation in C, pp 87-88.
620##
621## y = self.expovariate(alpha)
622## z = self.expovariate(1.0/beta)
623## return z/(y+z)
624##
625## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000626
Tim Petersd7b5e882001-01-25 03:36:26 +0000627 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000628 """Beta distribution.
629
Thomas Woutersb2137042007-02-01 18:02:27 +0000630 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000631 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000632
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000633 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000634
Tim Peters85e2e472001-01-26 06:49:56 +0000635 # This version due to Janne Sinkkonen, and matches all the std
636 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300637 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000638 if y == 0:
639 return 0.0
640 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300641 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000642
Tim Peterscd804102001-01-25 20:25:57 +0000643## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000644
Tim Petersd7b5e882001-01-25 03:36:26 +0000645 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000646 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000647 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000648
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000649 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000650 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000651
Tim Peterscd804102001-01-25 20:25:57 +0000652## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000653
Tim Petersd7b5e882001-01-25 03:36:26 +0000654 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000655 """Weibull distribution.
656
657 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000658
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000659 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000660 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000661
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000662 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000663 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000664
Raymond Hettinger23f12412004-09-13 22:23:21 +0000665## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000666
Raymond Hettinger23f12412004-09-13 22:23:21 +0000667class SystemRandom(Random):
668 """Alternate random number generator using sources provided
669 by the operating system (such as /dev/urandom on Unix or
670 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000671
672 Not available on all systems (see os.urandom() for details).
673 """
674
675 def random(self):
676 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000677 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000678
679 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300680 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000681 if k <= 0:
682 raise ValueError('number of bits must be greater than zero')
683 if k != int(k):
684 raise TypeError('number of bits should be an integer')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000685 numbytes = (k + 7) // 8 # bits / 8 and rounded up
686 x = int.from_bytes(_urandom(numbytes), 'big')
687 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000688
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000689 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000690 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000691 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000692
693 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000694 "Method should not be called for a system random number generator."
695 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000696 getstate = setstate = _notimplemented
697
Tim Peterscd804102001-01-25 20:25:57 +0000698## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000699
Raymond Hettinger62297132003-08-30 01:24:19 +0000700def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000701 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000702 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000703 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000704 sqsum = 0.0
705 smallest = 1e10
706 largest = -1e10
707 t0 = time.time()
708 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000709 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000710 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000711 sqsum = sqsum + x*x
712 smallest = min(x, smallest)
713 largest = max(x, largest)
714 t1 = time.time()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000715 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000716 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000717 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100718 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000719 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000720
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000721
722def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000723 _test_generator(N, random, ())
724 _test_generator(N, normalvariate, (0.0, 1.0))
725 _test_generator(N, lognormvariate, (0.0, 1.0))
726 _test_generator(N, vonmisesvariate, (0.0, 1.0))
727 _test_generator(N, gammavariate, (0.01, 1.0))
728 _test_generator(N, gammavariate, (0.1, 1.0))
729 _test_generator(N, gammavariate, (0.1, 2.0))
730 _test_generator(N, gammavariate, (0.5, 1.0))
731 _test_generator(N, gammavariate, (0.9, 1.0))
732 _test_generator(N, gammavariate, (1.0, 1.0))
733 _test_generator(N, gammavariate, (2.0, 1.0))
734 _test_generator(N, gammavariate, (20.0, 1.0))
735 _test_generator(N, gammavariate, (200.0, 1.0))
736 _test_generator(N, gauss, (0.0, 1.0))
737 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000738 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000739
Tim Peters715c4c42001-01-26 22:56:56 +0000740# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000741# as module-level functions. The functions share state across all uses
742#(both in the user's code and in the Python libraries), but that's fine
743# for most programs and is easier for the casual user than making them
744# instantiate their own Random() instance.
745
Tim Petersd7b5e882001-01-25 03:36:26 +0000746_inst = Random()
747seed = _inst.seed
748random = _inst.random
749uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000750triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000751randint = _inst.randint
752choice = _inst.choice
753randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000754sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000755shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700756choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000757normalvariate = _inst.normalvariate
758lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000759expovariate = _inst.expovariate
760vonmisesvariate = _inst.vonmisesvariate
761gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000762gauss = _inst.gauss
763betavariate = _inst.betavariate
764paretovariate = _inst.paretovariate
765weibullvariate = _inst.weibullvariate
766getstate = _inst.getstate
767setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000768getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000769
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200770if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700771 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200772
773
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000774if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000775 _test()