blob: 4b51b6696bfcd41f914e087bd39d2f3e07ea6a78 [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
Raymond Hettinger91e27c22005-08-19 01:36:35 +000041from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
Tim Petersd7b5e882001-01-25 03:36:26 +000042from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
Raymond Hettingerc1c43ca2004-09-05 00:00:42 +000043from os import urandom as _urandom
Christian Heimesf1dc3ee2013-10-13 02:04:20 +020044from _collections_abc import Set as _Set, Sequence as _Sequence
Raymond Hettinger3fcf0022010-12-08 01:13:53 +000045from hashlib import sha512 as _sha512
Raymond Hettingere8f1e002016-09-06 17:15:29 -070046import itertools as _itertools
47import bisect as _bisect
Antoine Pitrou346cbd32017-05-27 17:50:54 +020048import os as _os
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
Wolfgang Maierba3a87a2018-04-17 17:16:17 +020096 def __init_subclass__(cls, **kwargs):
97 """Control how subclasses generate random integers.
98
99 The algorithm a subclass can use depends on the random() and/or
100 getrandbits() implementation available to it and determines
101 whether it can generate random integers from arbitrarily large
102 ranges.
103 """
104
Serhiy Storchakaec1622d2018-05-08 15:45:15 +0300105 for c in cls.__mro__:
106 if '_randbelow' in c.__dict__:
107 # just inherit it
108 break
109 if 'getrandbits' in c.__dict__:
110 cls._randbelow = cls._randbelow_with_getrandbits
111 break
112 if 'random' in c.__dict__:
113 cls._randbelow = cls._randbelow_without_getrandbits
114 break
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200115
Raymond Hettingerf763a722010-09-07 00:38:15 +0000116 def seed(self, a=None, version=2):
Tim Peters0de88fc2001-02-01 04:59:18 +0000117 """Initialize internal state from hashable object.
Tim Petersd7b5e882001-01-25 03:36:26 +0000118
Raymond Hettinger23f12412004-09-13 22:23:21 +0000119 None or no argument seeds from current time or from an operating
120 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000121
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000122 If *a* is an int, all bits are used.
Raymond Hettingerf763a722010-09-07 00:38:15 +0000123
Raymond Hettinger16eb8272016-09-04 11:17:28 -0700124 For version 2 (the default), all of the bits are used if *a* is a str,
125 bytes, or bytearray. For version 1 (provided for reproducing random
126 sequences from older versions of Python), the algorithm for str and
127 bytes generates a narrower range of seeds.
128
Tim Petersd7b5e882001-01-25 03:36:26 +0000129 """
130
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700131 if version == 1 and isinstance(a, (str, bytes)):
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700132 a = a.decode('latin-1') if isinstance(a, bytes) else a
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700133 x = ord(a[0]) << 7 if a else 0
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700134 for c in map(ord, a):
135 x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700136 x ^= len(a)
137 a = -2 if x == -1 else x
138
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700139 if version == 2 and isinstance(a, (str, bytes, bytearray)):
140 if isinstance(a, str):
141 a = a.encode()
142 a += _sha512(a).digest()
143 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000144
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000145 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000146 self.gauss_next = None
147
Tim Peterscd804102001-01-25 20:25:57 +0000148 def getstate(self):
149 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000150 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000151
152 def setstate(self, state):
153 """Restore internal state from object returned by getstate()."""
154 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000155 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000156 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000157 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000158 elif version == 2:
159 version, internalstate, self.gauss_next = state
160 # In version 2, the state was saved as signed ints, which causes
161 # inconsistencies between 32/64-bit systems. The state is
162 # really unsigned 32-bit ints, so we convert negative ints from
163 # version 2 to positive longs for version 3.
164 try:
Raymond Hettingerc585eec2010-09-07 15:00:15 +0000165 internalstate = tuple(x % (2**32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000166 except ValueError as e:
167 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000168 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000169 else:
170 raise ValueError("state with version %s passed to "
171 "Random.setstate() of version %s" %
172 (version, self.VERSION))
173
Tim Peterscd804102001-01-25 20:25:57 +0000174## ---- Methods below this point do not need to be overridden when
175## ---- subclassing for the purpose of using a different core generator.
176
177## -------------------- pickle support -------------------
178
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400179 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
180 # longer called; we leave it here because it has been here since random was
181 # rewritten back in 2001 and why risk breaking something.
Tim Peterscd804102001-01-25 20:25:57 +0000182 def __getstate__(self): # for pickle
183 return self.getstate()
184
185 def __setstate__(self, state): # for pickle
186 self.setstate(state)
187
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000188 def __reduce__(self):
189 return self.__class__, (), self.getstate()
190
Tim Peterscd804102001-01-25 20:25:57 +0000191## -------------------- integer methods -------------------
192
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700193 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000194 """Choose a random item from range(start, stop[, step]).
195
196 This fixes the problem with randint() which includes the
197 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000198
Tim Petersd7b5e882001-01-25 03:36:26 +0000199 """
200
201 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000202 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700203 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000204 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000205 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000206 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000207 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000208 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000209 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000210
211 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700212 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000213 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000214 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000215 width = istop - istart
216 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000217 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000218 if step == 1:
Collin Winterce36ad82007-08-30 01:19:48 +0000219 raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000220
221 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700222 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000223 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000224 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000225 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000226 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000227 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000228 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000229 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000230 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000231
232 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000233 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000234
Raymond Hettinger05156612010-09-07 04:44:52 +0000235 return istart + istep*self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000236
237 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000238 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000239 """
240
241 return self.randrange(a, b+1)
242
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200243 def _randbelow_with_getrandbits(self, n):
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000244 "Return a random int in the range [0,n). Raises ValueError if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000245
Raymond Hettingerc3246972010-09-07 09:32:57 +0000246 getrandbits = self.getrandbits
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200247 k = n.bit_length() # don't use (n-1) here because n can be 1
248 r = getrandbits(k) # 0 <= r < 2**k
249 while r >= n:
250 r = getrandbits(k)
251 return r
252
253 def _randbelow_without_getrandbits(self, n, int=int, maxsize=1<<BPF):
254 """Return a random int in the range [0,n). Raises ValueError if n==0.
255
256 The implementation does not use getrandbits, but only random.
257 """
258
259 random = self.random
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000260 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000261 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000262 "enough bits to choose from a population range this large.\n"
263 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000264 return int(random() * n)
Wolfgang Maier091e95e2018-04-05 17:19:44 +0200265 if n == 0:
266 raise ValueError("Boundary cannot be zero")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000267 rem = maxsize % n
268 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
269 r = random()
270 while r >= limit:
271 r = random()
272 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000273
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200274 _randbelow = _randbelow_with_getrandbits
275
Tim Peterscd804102001-01-25 20:25:57 +0000276## -------------------- sequence methods -------------------
277
Tim Petersd7b5e882001-01-25 03:36:26 +0000278 def choice(self, seq):
279 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000280 try:
281 i = self._randbelow(len(seq))
282 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800283 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000284 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000285
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700286 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100287 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000288
Antoine Pitrou5e394332012-11-04 02:10:33 +0100289 Optional argument random is a 0-argument function returning a
290 random float in [0.0, 1.0); if it is the default None, the
291 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700292
Tim Petersd7b5e882001-01-25 03:36:26 +0000293 """
294
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700295 if random is None:
296 randbelow = self._randbelow
297 for i in reversed(range(1, len(x))):
298 # pick an element in x[:i+1] with which to exchange x[i]
299 j = randbelow(i+1)
300 x[i], x[j] = x[j], x[i]
301 else:
302 _int = int
303 for i in reversed(range(1, len(x))):
304 # pick an element in x[:i+1] with which to exchange x[i]
305 j = _int(random() * (i+1))
306 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000307
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000308 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000309 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000310
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000311 Returns a new list containing elements from the population while
312 leaving the original population unchanged. The resulting list is
313 in selection order so that all sub-slices will also be valid random
314 samples. This allows raffle winners (the sample) to be partitioned
315 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000316
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000317 Members of the population need not be hashable or unique. If the
318 population contains repeats, then each occurrence is a possible
319 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000320
Guido van Rossum805365e2007-05-07 22:24:25 +0000321 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000322 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000323 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000324 """
325
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000326 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000327 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000328
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000329 # When the number of selections is small compared to the
330 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000331 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000332 # a larger number of selections, the pool tracking method is
333 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000334 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000335
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000336 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000337 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000338 if not isinstance(population, _Sequence):
339 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000340 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000341 n = len(population)
342 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800343 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000344 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000345 setsize = 21 # size of a small set minus size of an empty list
346 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000347 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000348 if n <= setsize:
349 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000350 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000351 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000352 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000353 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000354 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000355 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000356 selected = set()
357 selected_add = selected.add
358 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000359 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000360 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000361 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000362 selected_add(j)
363 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000364 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000365
Raymond Hettinger9016f282016-09-26 21:45:57 -0700366 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700367 """Return a k sized list of population elements chosen with replacement.
368
369 If the relative weights or cumulative weights are not specified,
370 the selections are made with equal probability.
371
372 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700373 random = self.random
Raymond Hettingere69cd162018-07-04 15:28:20 -0700374 n = len(population)
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700375 if cum_weights is None:
376 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700377 _int = int
Raymond Hettinger0a18e052018-11-09 02:39:50 -0800378 n += 0.0 # convert to float for a small speed improvement
Raymond Hettingere69cd162018-07-04 15:28:20 -0700379 return [population[_int(random() * n)] for i in range(k)]
Raymond Hettinger8567e582016-11-01 22:23:11 -0700380 cum_weights = list(_itertools.accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700381 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500382 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere69cd162018-07-04 15:28:20 -0700383 if len(cum_weights) != n:
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700384 raise ValueError('The number of weights does not match the population')
385 bisect = _bisect.bisect
Raymond Hettinger0a18e052018-11-09 02:39:50 -0800386 total = cum_weights[-1] + 0.0 # convert to float
Raymond Hettingere69cd162018-07-04 15:28:20 -0700387 hi = n - 1
Raymond Hettingerddf71712018-06-27 01:08:31 -0700388 return [population[bisect(cum_weights, random() * total, 0, hi)]
389 for i in range(k)]
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700390
Tim Peterscd804102001-01-25 20:25:57 +0000391## -------------------- real-valued distributions -------------------
392
393## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000394
395 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000396 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000397 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000398
Christian Heimesfe337bf2008-03-23 21:54:12 +0000399## -------------------- triangular --------------------
400
401 def triangular(self, low=0.0, high=1.0, mode=None):
402 """Triangular distribution.
403
404 Continuous distribution bounded by given lower and upper limits,
405 and having a given mode value in-between.
406
407 http://en.wikipedia.org/wiki/Triangular_distribution
408
409 """
410 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700411 try:
412 c = 0.5 if mode is None else (mode - low) / (high - low)
413 except ZeroDivisionError:
414 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000415 if u > c:
416 u = 1.0 - u
417 c = 1.0 - c
418 low, high = high, low
Raymond Hettingerf5ea83f2017-09-04 16:51:06 -0700419 return low + (high - low) * _sqrt(u * c)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000420
Tim Peterscd804102001-01-25 20:25:57 +0000421## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000422
Tim Petersd7b5e882001-01-25 03:36:26 +0000423 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000424 """Normal distribution.
425
426 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000427
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000428 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000429 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000430
Tim Petersd7b5e882001-01-25 03:36:26 +0000431 # Uses Kinderman and Monahan method. Reference: Kinderman,
432 # A.J. and Monahan, J.F., "Computer generation of random
433 # variables using the ratio of uniform deviates", ACM Trans
434 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000435
Tim Petersd7b5e882001-01-25 03:36:26 +0000436 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000437 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000438 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000439 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000440 z = NV_MAGICCONST*(u1-0.5)/u2
441 zz = z*z/4.0
442 if zz <= -_log(u2):
443 break
444 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000445
Tim Peterscd804102001-01-25 20:25:57 +0000446## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000447
448 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000449 """Log normal distribution.
450
451 If you take the natural logarithm of this distribution, you'll get a
452 normal distribution with mean mu and standard deviation sigma.
453 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000454
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000455 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000456 return _exp(self.normalvariate(mu, sigma))
457
Tim Peterscd804102001-01-25 20:25:57 +0000458## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000459
460 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000461 """Exponential distribution.
462
Mark Dickinson2f947362009-01-07 17:54:07 +0000463 lambd is 1.0 divided by the desired mean. It should be
464 nonzero. (The parameter would be called "lambda", but that is
465 a reserved word in Python.) Returned values range from 0 to
466 positive infinity if lambd is positive, and from negative
467 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000468
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000469 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000470 # lambd: rate lambd = 1/mean
471 # ('lambda' is a Python reserved word)
472
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200473 # we use 1-random() instead of random() to preclude the
474 # possibility of taking the log of zero.
475 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000476
Tim Peterscd804102001-01-25 20:25:57 +0000477## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000478
Tim Petersd7b5e882001-01-25 03:36:26 +0000479 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000480 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000481
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000482 mu is the mean angle, expressed in radians between 0 and 2*pi, and
483 kappa is the concentration parameter, which must be greater than or
484 equal to zero. If kappa is equal to zero, this distribution reduces
485 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000486
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000487 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000488 # mu: mean angle (in radians between 0 and 2*pi)
489 # kappa: concentration parameter kappa (>= 0)
490 # if kappa = 0 generate uniform random angle
491
492 # Based upon an algorithm published in: Fisher, N.I.,
493 # "Statistical Analysis of Circular Data", Cambridge
494 # University Press, 1993.
495
496 # Thanks to Magnus Kessler for a correction to the
497 # implementation of step 4.
498
499 random = self.random
500 if kappa <= 1e-6:
501 return TWOPI * random()
502
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200503 s = 0.5 / kappa
504 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000505
Raymond Hettinger42406e62005-04-30 09:02:51 +0000506 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000507 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000508 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000509
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200510 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000511 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200512 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000513 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000514
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200515 q = 1.0 / r
516 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000517 u3 = random()
518 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000519 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000520 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000521 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000522
523 return theta
524
Tim Peterscd804102001-01-25 20:25:57 +0000525## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000526
527 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000528 """Gamma distribution. Not the gamma function!
529
530 Conditions on the parameters are alpha > 0 and beta > 0.
531
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700532 The probability distribution function is:
533
534 x ** (alpha - 1) * math.exp(-x / beta)
535 pdf(x) = --------------------------------------
536 math.gamma(alpha) * beta ** alpha
537
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000538 """
Tim Peters8ac14952002-05-23 15:15:30 +0000539
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000540 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000541
Guido van Rossum570764d2002-05-14 14:08:12 +0000542 # Warning: a few older sources define the gamma distribution in terms
543 # of alpha > -1.0
544 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000545 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000546
Tim Petersd7b5e882001-01-25 03:36:26 +0000547 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000548 if alpha > 1.0:
549
550 # Uses R.C.H. Cheng, "The generation of Gamma
551 # variables with non-integral shape parameters",
552 # Applied Statistics, (1977), 26, No. 1, p71-74
553
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000554 ainv = _sqrt(2.0 * alpha - 1.0)
555 bbb = alpha - LOG4
556 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000557
Raymond Hettinger42406e62005-04-30 09:02:51 +0000558 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000559 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000560 if not 1e-7 < u1 < .9999999:
561 continue
562 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000563 v = _log(u1/(1.0-u1))/ainv
564 x = alpha*_exp(v)
565 z = u1*u1*u2
566 r = bbb+ccc*v-x
567 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000568 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000569
570 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100571 # expovariate(1/beta)
Tim Petersd7b5e882001-01-25 03:36:26 +0000572 u = random()
573 while u <= 1e-7:
574 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000575 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000576
577 else: # alpha is between 0 and 1 (exclusive)
578
579 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
580
Raymond Hettinger42406e62005-04-30 09:02:51 +0000581 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000582 u = random()
583 b = (_e + alpha)/_e
584 p = b*u
585 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000586 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000587 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000588 x = -_log((b-p)/alpha)
589 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000590 if p > 1.0:
591 if u1 <= x ** (alpha - 1.0):
592 break
593 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000594 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000595 return x * beta
596
Tim Peterscd804102001-01-25 20:25:57 +0000597## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000598
Tim Petersd7b5e882001-01-25 03:36:26 +0000599 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000600 """Gaussian distribution.
601
602 mu is the mean, and sigma is the standard deviation. This is
603 slightly faster than the normalvariate() function.
604
605 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000606
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000607 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000608
Tim Petersd7b5e882001-01-25 03:36:26 +0000609 # When x and y are two variables from [0, 1), uniformly
610 # distributed, then
611 #
612 # cos(2*pi*x)*sqrt(-2*log(1-y))
613 # sin(2*pi*x)*sqrt(-2*log(1-y))
614 #
615 # are two *independent* variables with normal distribution
616 # (mu = 0, sigma = 1).
617 # (Lambert Meertens)
618 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000619
Tim Petersd7b5e882001-01-25 03:36:26 +0000620 # Multithreading note: When two threads call this function
621 # simultaneously, it is possible that they will receive the
622 # same return value. The window is very small though. To
623 # avoid this, you have to use a lock around all calls. (I
624 # didn't want to slow this down in the serial case by using a
625 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000626
Tim Petersd7b5e882001-01-25 03:36:26 +0000627 random = self.random
628 z = self.gauss_next
629 self.gauss_next = None
630 if z is None:
631 x2pi = random() * TWOPI
632 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
633 z = _cos(x2pi) * g2rad
634 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000635
Tim Petersd7b5e882001-01-25 03:36:26 +0000636 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000637
Tim Peterscd804102001-01-25 20:25:57 +0000638## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000639## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300640## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000641## for Ivan Frohne's insightful analysis of why the original implementation:
642##
643## def betavariate(self, alpha, beta):
644## # Discrete Event Simulation in C, pp 87-88.
645##
646## y = self.expovariate(alpha)
647## z = self.expovariate(1.0/beta)
648## return z/(y+z)
649##
650## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000651
Tim Petersd7b5e882001-01-25 03:36:26 +0000652 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000653 """Beta distribution.
654
Thomas Woutersb2137042007-02-01 18:02:27 +0000655 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000656 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000657
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000658 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000659
Tim Peters85e2e472001-01-26 06:49:56 +0000660 # This version due to Janne Sinkkonen, and matches all the std
661 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300662 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000663 if y == 0:
664 return 0.0
665 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300666 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000667
Tim Peterscd804102001-01-25 20:25:57 +0000668## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000669
Tim Petersd7b5e882001-01-25 03:36:26 +0000670 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000671 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000672 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000673
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000674 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000675 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000676
Tim Peterscd804102001-01-25 20:25:57 +0000677## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000678
Tim Petersd7b5e882001-01-25 03:36:26 +0000679 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000680 """Weibull distribution.
681
682 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000683
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000684 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000685 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000686
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000687 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000688 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000689
Raymond Hettinger23f12412004-09-13 22:23:21 +0000690## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000691
Raymond Hettinger23f12412004-09-13 22:23:21 +0000692class SystemRandom(Random):
693 """Alternate random number generator using sources provided
694 by the operating system (such as /dev/urandom on Unix or
695 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000696
697 Not available on all systems (see os.urandom() for details).
698 """
699
700 def random(self):
701 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000702 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000703
704 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300705 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000706 if k <= 0:
707 raise ValueError('number of bits must be greater than zero')
708 if k != int(k):
709 raise TypeError('number of bits should be an integer')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000710 numbytes = (k + 7) // 8 # bits / 8 and rounded up
711 x = int.from_bytes(_urandom(numbytes), 'big')
712 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000713
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000714 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000715 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000716 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000717
718 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000719 "Method should not be called for a system random number generator."
720 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000721 getstate = setstate = _notimplemented
722
Tim Peterscd804102001-01-25 20:25:57 +0000723## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000724
Raymond Hettinger62297132003-08-30 01:24:19 +0000725def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000726 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000727 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000728 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000729 sqsum = 0.0
730 smallest = 1e10
731 largest = -1e10
732 t0 = time.time()
733 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000734 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000735 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000736 sqsum = sqsum + x*x
737 smallest = min(x, smallest)
738 largest = max(x, largest)
739 t1 = time.time()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000740 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000741 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000742 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100743 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000744 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000745
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000746
747def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000748 _test_generator(N, random, ())
749 _test_generator(N, normalvariate, (0.0, 1.0))
750 _test_generator(N, lognormvariate, (0.0, 1.0))
751 _test_generator(N, vonmisesvariate, (0.0, 1.0))
752 _test_generator(N, gammavariate, (0.01, 1.0))
753 _test_generator(N, gammavariate, (0.1, 1.0))
754 _test_generator(N, gammavariate, (0.1, 2.0))
755 _test_generator(N, gammavariate, (0.5, 1.0))
756 _test_generator(N, gammavariate, (0.9, 1.0))
757 _test_generator(N, gammavariate, (1.0, 1.0))
758 _test_generator(N, gammavariate, (2.0, 1.0))
759 _test_generator(N, gammavariate, (20.0, 1.0))
760 _test_generator(N, gammavariate, (200.0, 1.0))
761 _test_generator(N, gauss, (0.0, 1.0))
762 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000763 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000764
Tim Peters715c4c42001-01-26 22:56:56 +0000765# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000766# as module-level functions. The functions share state across all uses
767#(both in the user's code and in the Python libraries), but that's fine
768# for most programs and is easier for the casual user than making them
769# instantiate their own Random() instance.
770
Tim Petersd7b5e882001-01-25 03:36:26 +0000771_inst = Random()
772seed = _inst.seed
773random = _inst.random
774uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000775triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000776randint = _inst.randint
777choice = _inst.choice
778randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000779sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000780shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700781choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000782normalvariate = _inst.normalvariate
783lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000784expovariate = _inst.expovariate
785vonmisesvariate = _inst.vonmisesvariate
786gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000787gauss = _inst.gauss
788betavariate = _inst.betavariate
789paretovariate = _inst.paretovariate
790weibullvariate = _inst.weibullvariate
791getstate = _inst.getstate
792setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000793getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000794
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200795if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700796 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200797
798
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000799if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000800 _test()