blob: 02a56c6935b893319849b0e32ae4ab95615995cc [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
Miss Islington (bot)f1534d02020-06-13 10:23:48 -070042from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin, tau as TWOPI
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 Hettinger53822032019-02-16 13:30:51 -080045from itertools import accumulate as _accumulate, repeat as _repeat
Raymond Hettingercfd31f02019-02-13 02:04:17 -080046from bisect import bisect as _bisect
Antoine Pitrou346cbd32017-05-27 17:50:54 +020047import os as _os
Guido van Rossumff03b1a1994-03-09 12:55:02 +000048
Christian Heimesd9145962019-04-10 22:18:02 +020049try:
50 # hashlib is pretty heavy to load, try lean internal module first
51 from _sha512 import sha512 as _sha512
52except ImportError:
53 # fallback to official implementation
54 from hashlib import sha512 as _sha512
55
56
Miss Islington (bot)f1534d02020-06-13 10:23:48 -070057__all__ = [
58 "Random",
59 "SystemRandom",
60 "betavariate",
61 "choice",
62 "choices",
63 "expovariate",
64 "gammavariate",
65 "gauss",
66 "getrandbits",
67 "getstate",
68 "lognormvariate",
69 "normalvariate",
70 "paretovariate",
71 "randint",
72 "random",
73 "randrange",
74 "sample",
75 "seed",
76 "setstate",
77 "shuffle",
78 "triangular",
79 "uniform",
80 "vonmisesvariate",
81 "weibullvariate",
82]
Tim Petersd7b5e882001-01-25 03:36:26 +000083
Miss Islington (bot)f1534d02020-06-13 10:23:48 -070084NV_MAGICCONST = 4 * _exp(-0.5) / _sqrt(2.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000085LOG4 = _log(4.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000086SG_MAGICCONST = 1.0 + _log(4.5)
Raymond Hettinger2f726e92003-10-05 09:09:15 +000087BPF = 53 # Number of bits in a float
Miss Islington (bot)f1534d02020-06-13 10:23:48 -070088RECIP_BPF = 2 ** -BPF
Tim Petersd7b5e882001-01-25 03:36:26 +000089
Raymond Hettinger356a4592004-08-30 06:14:31 +000090
Tim Petersd7b5e882001-01-25 03:36:26 +000091# Translated by Guido van Rossum from C source provided by
Raymond Hettinger40f62172002-12-29 23:03:38 +000092# Adrian Baddeley. Adapted by Raymond Hettinger for use with
Raymond Hettinger3fa19d72004-08-31 01:05:15 +000093# the Mersenne Twister and os.urandom() core generators.
Tim Petersd7b5e882001-01-25 03:36:26 +000094
Raymond Hettinger145a4a02003-01-07 10:25:55 +000095import _random
Raymond Hettinger40f62172002-12-29 23:03:38 +000096
Miss Islington (bot)f1534d02020-06-13 10:23:48 -070097
Raymond Hettinger145a4a02003-01-07 10:25:55 +000098class Random(_random.Random):
Raymond Hettingerc32f0332002-05-23 19:44:49 +000099 """Random number generator base class used by bound module functions.
100
101 Used to instantiate instances of Random to get generators that don't
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000102 share state.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000103
104 Class Random can also be subclassed if you want to use a different basic
105 generator of your own devising: in that case, override the following
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000106 methods: random(), seed(), getstate(), and setstate().
Benjamin Petersond18de0e2008-07-31 20:21:46 +0000107 Optionally, implement a getrandbits() method so that randrange()
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000108 can cover arbitrarily large ranges.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000109
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000110 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000111
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000112 VERSION = 3 # used by getstate/setstate
Tim Petersd7b5e882001-01-25 03:36:26 +0000113
114 def __init__(self, x=None):
115 """Initialize an instance.
116
117 Optional argument x controls seeding, as for Random.seed().
118 """
119
120 self.seed(x)
Raymond Hettinger40f62172002-12-29 23:03:38 +0000121 self.gauss_next = None
Tim Petersd7b5e882001-01-25 03:36:26 +0000122
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300123 def __init_subclass__(cls, /, **kwargs):
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200124 """Control how subclasses generate random integers.
125
126 The algorithm a subclass can use depends on the random() and/or
127 getrandbits() implementation available to it and determines
128 whether it can generate random integers from arbitrarily large
129 ranges.
130 """
131
Serhiy Storchakaec1622d2018-05-08 15:45:15 +0300132 for c in cls.__mro__:
133 if '_randbelow' in c.__dict__:
134 # just inherit it
135 break
136 if 'getrandbits' in c.__dict__:
137 cls._randbelow = cls._randbelow_with_getrandbits
138 break
139 if 'random' in c.__dict__:
140 cls._randbelow = cls._randbelow_without_getrandbits
141 break
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200142
Raymond Hettingerf763a722010-09-07 00:38:15 +0000143 def seed(self, a=None, version=2):
Raymond Hettingerd0cdeaa2019-08-22 09:19:36 -0700144 """Initialize internal state from a seed.
145
146 The only supported seed types are None, int, float,
147 str, bytes, and bytearray.
Tim Petersd7b5e882001-01-25 03:36:26 +0000148
Raymond Hettinger23f12412004-09-13 22:23:21 +0000149 None or no argument seeds from current time or from an operating
150 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000151
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000152 If *a* is an int, all bits are used.
Raymond Hettingerf763a722010-09-07 00:38:15 +0000153
Raymond Hettinger16eb8272016-09-04 11:17:28 -0700154 For version 2 (the default), all of the bits are used if *a* is a str,
155 bytes, or bytearray. For version 1 (provided for reproducing random
156 sequences from older versions of Python), the algorithm for str and
157 bytes generates a narrower range of seeds.
158
Tim Petersd7b5e882001-01-25 03:36:26 +0000159 """
160
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700161 if version == 1 and isinstance(a, (str, bytes)):
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700162 a = a.decode('latin-1') if isinstance(a, bytes) else a
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700163 x = ord(a[0]) << 7 if a else 0
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700164 for c in map(ord, a):
165 x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700166 x ^= len(a)
167 a = -2 if x == -1 else x
168
Raymond Hettingerd0cdeaa2019-08-22 09:19:36 -0700169 elif version == 2 and isinstance(a, (str, bytes, bytearray)):
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700170 if isinstance(a, str):
171 a = a.encode()
172 a += _sha512(a).digest()
173 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000174
Raymond Hettingerd0cdeaa2019-08-22 09:19:36 -0700175 elif not isinstance(a, (type(None), int, float, str, bytes, bytearray)):
176 _warn('Seeding based on hashing is deprecated\n'
177 'since Python 3.9 and will be removed in a subsequent '
178 'version. The only \n'
179 'supported seed types are: None, '
180 'int, float, str, bytes, and bytearray.',
181 DeprecationWarning, 2)
182
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000183 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000184 self.gauss_next = None
185
Tim Peterscd804102001-01-25 20:25:57 +0000186 def getstate(self):
187 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000188 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000189
190 def setstate(self, state):
191 """Restore internal state from object returned by getstate()."""
192 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000193 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000194 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000195 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000196 elif version == 2:
197 version, internalstate, self.gauss_next = state
198 # In version 2, the state was saved as signed ints, which causes
199 # inconsistencies between 32/64-bit systems. The state is
200 # really unsigned 32-bit ints, so we convert negative ints from
201 # version 2 to positive longs for version 3.
202 try:
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700203 internalstate = tuple(x % (2 ** 32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000204 except ValueError as e:
205 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000206 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000207 else:
208 raise ValueError("state with version %s passed to "
209 "Random.setstate() of version %s" %
210 (version, self.VERSION))
211
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700212 ## ---- Methods below this point do not need to be overridden when
213 ## ---- subclassing for the purpose of using a different core generator.
Tim Peterscd804102001-01-25 20:25:57 +0000214
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700215 ## -------------------- bytes methods ---------------------
Victor Stinner2d875772020-04-29 18:49:00 +0200216
217 def randbytes(self, n):
218 """Generate n random bytes."""
219 return self.getrandbits(n * 8).to_bytes(n, 'little')
220
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700221 ## -------------------- pickle support -------------------
Tim Peterscd804102001-01-25 20:25:57 +0000222
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400223 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
224 # longer called; we leave it here because it has been here since random was
225 # rewritten back in 2001 and why risk breaking something.
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700226 def __getstate__(self): # for pickle
Tim Peterscd804102001-01-25 20:25:57 +0000227 return self.getstate()
228
229 def __setstate__(self, state): # for pickle
230 self.setstate(state)
231
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000232 def __reduce__(self):
233 return self.__class__, (), self.getstate()
234
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700235 ## -------------------- integer methods -------------------
Tim Peterscd804102001-01-25 20:25:57 +0000236
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700237 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000238 """Choose a random item from range(start, stop[, step]).
239
240 This fixes the problem with randint() which includes the
241 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000242
Tim Petersd7b5e882001-01-25 03:36:26 +0000243 """
244
245 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000246 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700247 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000248 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000249 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000250 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000251 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000252 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000253 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000254
255 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700256 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000257 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000258 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000259 width = istop - istart
260 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000261 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000262 if step == 1:
Kumar Akshay2433a2a2019-01-22 00:49:59 +0530263 raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000264
265 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700266 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000267 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000268 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000269 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000270 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000271 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000272 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000273 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000274 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000275
276 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000277 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000278
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700279 return istart + istep * self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000280
281 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000282 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000283 """
284
285 return self.randrange(a, b+1)
286
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200287 def _randbelow_with_getrandbits(self, n):
Raymond Hettinger4168f1e2020-05-01 10:34:19 -0700288 "Return a random int in the range [0,n). Returns 0 if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000289
Antoine Pitrou75a33782020-04-17 19:32:14 +0200290 if not n:
Raymond Hettinger4168f1e2020-05-01 10:34:19 -0700291 return 0
Raymond Hettingerc3246972010-09-07 09:32:57 +0000292 getrandbits = self.getrandbits
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200293 k = n.bit_length() # don't use (n-1) here because n can be 1
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700294 r = getrandbits(k) # 0 <= r < 2**k
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200295 while r >= n:
296 r = getrandbits(k)
297 return r
298
299 def _randbelow_without_getrandbits(self, n, int=int, maxsize=1<<BPF):
Raymond Hettinger4168f1e2020-05-01 10:34:19 -0700300 """Return a random int in the range [0,n). Returns 0 if n==0.
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200301
302 The implementation does not use getrandbits, but only random.
303 """
304
305 random = self.random
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000306 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000307 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000308 "enough bits to choose from a population range this large.\n"
309 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000310 return int(random() * n)
Wolfgang Maier091e95e2018-04-05 17:19:44 +0200311 if n == 0:
Raymond Hettinger4168f1e2020-05-01 10:34:19 -0700312 return 0
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000313 rem = maxsize % n
314 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
315 r = random()
316 while r >= limit:
317 r = random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700318 return int(r * maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000319
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200320 _randbelow = _randbelow_with_getrandbits
321
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700322 ## -------------------- sequence methods -------------------
Tim Peterscd804102001-01-25 20:25:57 +0000323
Tim Petersd7b5e882001-01-25 03:36:26 +0000324 def choice(self, seq):
325 """Choose a random element from a non-empty sequence."""
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700326 # raises IndexError if seq is empty
327 return seq[self._randbelow(len(seq))]
Tim Petersd7b5e882001-01-25 03:36:26 +0000328
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700329 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100330 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000331
Antoine Pitrou5e394332012-11-04 02:10:33 +0100332 Optional argument random is a 0-argument function returning a
333 random float in [0.0, 1.0); if it is the default None, the
334 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700335
Tim Petersd7b5e882001-01-25 03:36:26 +0000336 """
337
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700338 if random is None:
339 randbelow = self._randbelow
340 for i in reversed(range(1, len(x))):
341 # pick an element in x[:i+1] with which to exchange x[i]
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700342 j = randbelow(i + 1)
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700343 x[i], x[j] = x[j], x[i]
344 else:
Raymond Hettinger190fac92020-05-02 16:45:32 -0700345 _warn('The *random* parameter to shuffle() has been deprecated\n'
346 'since Python 3.9 and will be removed in a subsequent '
347 'version.',
348 DeprecationWarning, 2)
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700349 _int = int
350 for i in reversed(range(1, len(x))):
351 # pick an element in x[:i+1] with which to exchange x[i]
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700352 j = _int(random() * (i + 1))
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700353 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000354
Raymond Hettinger81a5fc32020-05-08 07:53:15 -0700355 def sample(self, population, k, *, counts=None):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000356 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000357
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000358 Returns a new list containing elements from the population while
359 leaving the original population unchanged. The resulting list is
360 in selection order so that all sub-slices will also be valid random
361 samples. This allows raffle winners (the sample) to be partitioned
362 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000363
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000364 Members of the population need not be hashable or unique. If the
365 population contains repeats, then each occurrence is a possible
366 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000367
Raymond Hettinger81a5fc32020-05-08 07:53:15 -0700368 Repeated elements can be specified one at a time or with the optional
369 counts parameter. For example:
370
371 sample(['red', 'blue'], counts=[4, 2], k=5)
372
373 is equivalent to:
374
375 sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
376
377 To choose a sample from a range of integers, use range() for the
378 population argument. This is especially fast and space efficient
379 for sampling from a large population:
380
381 sample(range(10000000), 60)
382
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000383 """
384
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000385 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000386 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000387
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000388 # When the number of selections is small compared to the
389 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000390 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000391 # a larger number of selections, the pool tracking method is
392 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000393 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000394
Raymond Hettinger7fc633f2018-12-04 00:13:38 -0800395 # The number of calls to _randbelow() is kept at or near k, the
396 # theoretical minimum. This is important because running time
397 # is dominated by _randbelow() and because it extracts the
398 # least entropy from the underlying random number generators.
399
400 # Memory requirements are kept to the smaller of a k-length
401 # set or an n-length list.
402
403 # There are other sampling algorithms that do not require
404 # auxiliary memory, but they were rejected because they made
405 # too many calls to _randbelow(), making them slower and
406 # causing them to eat more entropy than necessary.
407
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000408 if isinstance(population, _Set):
Raymond Hettinger4fe00202020-04-19 00:36:42 -0700409 _warn('Sampling from a set deprecated\n'
410 'since Python 3.9 and will be removed in a subsequent version.',
411 DeprecationWarning, 2)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000412 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000413 if not isinstance(population, _Sequence):
Raymond Hettinger4fe00202020-04-19 00:36:42 -0700414 raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).")
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000415 n = len(population)
Raymond Hettinger81a5fc32020-05-08 07:53:15 -0700416 if counts is not None:
417 cum_counts = list(_accumulate(counts))
418 if len(cum_counts) != n:
419 raise ValueError('The number of counts does not match the population')
420 total = cum_counts.pop()
421 if not isinstance(total, int):
422 raise TypeError('Counts must be integers')
423 if total <= 0:
424 raise ValueError('Total of counts must be greater than zero')
425 selections = sample(range(total), k=k)
426 bisect = _bisect
427 return [population[bisect(cum_counts, s)] for s in selections]
428 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000429 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800430 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000431 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000432 setsize = 21 # size of a small set minus size of an empty list
433 if k > 5:
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700434 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000435 if n <= setsize:
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700436 # An n-length list is smaller than a k-length set.
437 # Invariant: non-selected at pool[0 : n-i]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000438 pool = list(population)
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700439 for i in range(k):
440 j = randbelow(n - i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000441 result[i] = pool[j]
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700442 pool[j] = pool[n - i - 1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000443 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000444 selected = set()
445 selected_add = selected.add
446 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000447 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000448 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000449 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000450 selected_add(j)
451 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000452 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000453
Raymond Hettinger9016f282016-09-26 21:45:57 -0700454 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700455 """Return a k sized list of population elements chosen with replacement.
456
457 If the relative weights or cumulative weights are not specified,
458 the selections are made with equal probability.
459
460 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700461 random = self.random
Raymond Hettingere69cd162018-07-04 15:28:20 -0700462 n = len(population)
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700463 if cum_weights is None:
464 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700465 _int = int
Raymond Hettinger0a18e052018-11-09 02:39:50 -0800466 n += 0.0 # convert to float for a small speed improvement
Raymond Hettinger53822032019-02-16 13:30:51 -0800467 return [population[_int(random() * n)] for i in _repeat(None, k)]
Raymond Hettingercfd31f02019-02-13 02:04:17 -0800468 cum_weights = list(_accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700469 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500470 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere69cd162018-07-04 15:28:20 -0700471 if len(cum_weights) != n:
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700472 raise ValueError('The number of weights does not match the population')
Raymond Hettinger0a18e052018-11-09 02:39:50 -0800473 total = cum_weights[-1] + 0.0 # convert to float
Raymond Hettinger041d8b42019-11-23 02:22:13 -0800474 if total <= 0.0:
475 raise ValueError('Total of weights must be greater than zero')
476 bisect = _bisect
Raymond Hettingere69cd162018-07-04 15:28:20 -0700477 hi = n - 1
Raymond Hettingerddf71712018-06-27 01:08:31 -0700478 return [population[bisect(cum_weights, random() * total, 0, hi)]
Raymond Hettinger53822032019-02-16 13:30:51 -0800479 for i in _repeat(None, k)]
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700480
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700481 ## -------------------- real-valued distributions -------------------
Tim Peterscd804102001-01-25 20:25:57 +0000482
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700483 ## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000484
485 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000486 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700487 return a + (b - a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000488
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700489 ## -------------------- triangular --------------------
Christian Heimesfe337bf2008-03-23 21:54:12 +0000490
491 def triangular(self, low=0.0, high=1.0, mode=None):
492 """Triangular distribution.
493
494 Continuous distribution bounded by given lower and upper limits,
495 and having a given mode value in-between.
496
497 http://en.wikipedia.org/wiki/Triangular_distribution
498
499 """
500 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700501 try:
502 c = 0.5 if mode is None else (mode - low) / (high - low)
503 except ZeroDivisionError:
504 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000505 if u > c:
506 u = 1.0 - u
507 c = 1.0 - c
508 low, high = high, low
Raymond Hettingerf5ea83f2017-09-04 16:51:06 -0700509 return low + (high - low) * _sqrt(u * c)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000510
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700511 ## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000512
Tim Petersd7b5e882001-01-25 03:36:26 +0000513 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000514 """Normal distribution.
515
516 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000517
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000518 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000519 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000520
Tim Petersd7b5e882001-01-25 03:36:26 +0000521 # Uses Kinderman and Monahan method. Reference: Kinderman,
522 # A.J. and Monahan, J.F., "Computer generation of random
523 # variables using the ratio of uniform deviates", ACM Trans
524 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000525
Tim Petersd7b5e882001-01-25 03:36:26 +0000526 random = self.random
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700527 while True:
Tim Peters0c9886d2001-01-15 01:18:21 +0000528 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000529 u2 = 1.0 - random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700530 z = NV_MAGICCONST * (u1 - 0.5) / u2
531 zz = z * z / 4.0
Tim Petersd7b5e882001-01-25 03:36:26 +0000532 if zz <= -_log(u2):
533 break
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700534 return mu + z * sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000535
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700536 ## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000537
538 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000539 """Log normal distribution.
540
541 If you take the natural logarithm of this distribution, you'll get a
542 normal distribution with mean mu and standard deviation sigma.
543 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000544
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000545 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000546 return _exp(self.normalvariate(mu, sigma))
547
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700548 ## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000549
550 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000551 """Exponential distribution.
552
Mark Dickinson2f947362009-01-07 17:54:07 +0000553 lambd is 1.0 divided by the desired mean. It should be
554 nonzero. (The parameter would be called "lambda", but that is
555 a reserved word in Python.) Returned values range from 0 to
556 positive infinity if lambd is positive, and from negative
557 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000558
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000559 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000560 # lambd: rate lambd = 1/mean
561 # ('lambda' is a Python reserved word)
562
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200563 # we use 1-random() instead of random() to preclude the
564 # possibility of taking the log of zero.
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700565 return -_log(1.0 - self.random()) / lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000566
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700567 ## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000568
Tim Petersd7b5e882001-01-25 03:36:26 +0000569 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000570 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000571
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000572 mu is the mean angle, expressed in radians between 0 and 2*pi, and
573 kappa is the concentration parameter, which must be greater than or
574 equal to zero. If kappa is equal to zero, this distribution reduces
575 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000576
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000577 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000578 # mu: mean angle (in radians between 0 and 2*pi)
579 # kappa: concentration parameter kappa (>= 0)
580 # if kappa = 0 generate uniform random angle
581
582 # Based upon an algorithm published in: Fisher, N.I.,
583 # "Statistical Analysis of Circular Data", Cambridge
584 # University Press, 1993.
585
586 # Thanks to Magnus Kessler for a correction to the
587 # implementation of step 4.
588
589 random = self.random
590 if kappa <= 1e-6:
591 return TWOPI * random()
592
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200593 s = 0.5 / kappa
594 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000595
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700596 while True:
Tim Peters0c9886d2001-01-15 01:18:21 +0000597 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000598 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000599
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200600 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000601 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200602 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000603 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000604
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200605 q = 1.0 / r
606 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000607 u3 = random()
608 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000609 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000610 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000611 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000612
613 return theta
614
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700615 ## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000616
617 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000618 """Gamma distribution. Not the gamma function!
619
620 Conditions on the parameters are alpha > 0 and beta > 0.
621
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700622 The probability distribution function is:
623
624 x ** (alpha - 1) * math.exp(-x / beta)
625 pdf(x) = --------------------------------------
626 math.gamma(alpha) * beta ** alpha
627
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000628 """
Tim Peters8ac14952002-05-23 15:15:30 +0000629
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000630 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000631
Guido van Rossum570764d2002-05-14 14:08:12 +0000632 # Warning: a few older sources define the gamma distribution in terms
633 # of alpha > -1.0
634 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000635 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000636
Tim Petersd7b5e882001-01-25 03:36:26 +0000637 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000638 if alpha > 1.0:
639
640 # Uses R.C.H. Cheng, "The generation of Gamma
641 # variables with non-integral shape parameters",
642 # Applied Statistics, (1977), 26, No. 1, p71-74
643
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000644 ainv = _sqrt(2.0 * alpha - 1.0)
645 bbb = alpha - LOG4
646 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000647
Raymond Hettinger42406e62005-04-30 09:02:51 +0000648 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000649 u1 = random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700650 if not 1e-7 < u1 < 0.9999999:
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000651 continue
652 u2 = 1.0 - random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700653 v = _log(u1 / (1.0 - u1)) / ainv
654 x = alpha * _exp(v)
655 z = u1 * u1 * u2
656 r = bbb + ccc * v - x
657 if r + SG_MAGICCONST - 4.5 * z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000658 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000659
660 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100661 # expovariate(1/beta)
leodema63d15222018-12-24 07:54:25 +0100662 return -_log(1.0 - random()) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000663
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700664 else:
665 # alpha is between 0 and 1 (exclusive)
Tim Petersd7b5e882001-01-25 03:36:26 +0000666 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700667 while True:
Tim Petersd7b5e882001-01-25 03:36:26 +0000668 u = random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700669 b = (_e + alpha) / _e
670 p = b * u
Tim Petersd7b5e882001-01-25 03:36:26 +0000671 if p <= 1.0:
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700672 x = p ** (1.0 / alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000673 else:
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700674 x = -_log((b - p) / alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000675 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000676 if p > 1.0:
677 if u1 <= x ** (alpha - 1.0):
678 break
679 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000680 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000681 return x * beta
682
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700683 ## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000684
Tim Petersd7b5e882001-01-25 03:36:26 +0000685 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000686 """Gaussian distribution.
687
688 mu is the mean, and sigma is the standard deviation. This is
689 slightly faster than the normalvariate() function.
690
691 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000692
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000693 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000694
Tim Petersd7b5e882001-01-25 03:36:26 +0000695 # When x and y are two variables from [0, 1), uniformly
696 # distributed, then
697 #
698 # cos(2*pi*x)*sqrt(-2*log(1-y))
699 # sin(2*pi*x)*sqrt(-2*log(1-y))
700 #
701 # are two *independent* variables with normal distribution
702 # (mu = 0, sigma = 1).
703 # (Lambert Meertens)
704 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000705
Tim Petersd7b5e882001-01-25 03:36:26 +0000706 # Multithreading note: When two threads call this function
707 # simultaneously, it is possible that they will receive the
708 # same return value. The window is very small though. To
709 # avoid this, you have to use a lock around all calls. (I
710 # didn't want to slow this down in the serial case by using a
711 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000712
Tim Petersd7b5e882001-01-25 03:36:26 +0000713 random = self.random
714 z = self.gauss_next
715 self.gauss_next = None
716 if z is None:
717 x2pi = random() * TWOPI
718 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
719 z = _cos(x2pi) * g2rad
720 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000721
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700722 return mu + z * sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000723
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700724 ## -------------------- beta --------------------
725 ## See
726 ## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
727 ## for Ivan Frohne's insightful analysis of why the original implementation:
728 ##
729 ## def betavariate(self, alpha, beta):
730 ## # Discrete Event Simulation in C, pp 87-88.
731 ##
732 ## y = self.expovariate(alpha)
733 ## z = self.expovariate(1.0/beta)
734 ## return z/(y+z)
735 ##
736 ## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000737
Tim Petersd7b5e882001-01-25 03:36:26 +0000738 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000739 """Beta distribution.
740
Thomas Woutersb2137042007-02-01 18:02:27 +0000741 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000742 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000743
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000744 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000745
Tim Peters85e2e472001-01-26 06:49:56 +0000746 # This version due to Janne Sinkkonen, and matches all the std
747 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300748 y = self.gammavariate(alpha, 1.0)
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700749 if y:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300750 return y / (y + self.gammavariate(beta, 1.0))
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700751 return 0.0
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000752
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700753 ## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000754
Tim Petersd7b5e882001-01-25 03:36:26 +0000755 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000756 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000757 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000758
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000759 u = 1.0 - self.random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700760 return 1.0 / u ** (1.0 / alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000761
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700762 ## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000763
Tim Petersd7b5e882001-01-25 03:36:26 +0000764 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000765 """Weibull distribution.
766
767 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000768
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000769 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000770 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000771
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000772 u = 1.0 - self.random()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700773 return alpha * (-_log(u)) ** (1.0 / beta)
774
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000775
Raymond Hettinger23f12412004-09-13 22:23:21 +0000776## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000777
Raymond Hettinger23f12412004-09-13 22:23:21 +0000778class SystemRandom(Random):
779 """Alternate random number generator using sources provided
780 by the operating system (such as /dev/urandom on Unix or
781 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000782
783 Not available on all systems (see os.urandom() for details).
784 """
785
786 def random(self):
787 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000788 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000789
790 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300791 """getrandbits(k) -> x. Generates an int with k random bits."""
Antoine Pitrou75a33782020-04-17 19:32:14 +0200792 if k < 0:
793 raise ValueError('number of bits must be non-negative')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000794 numbytes = (k + 7) // 8 # bits / 8 and rounded up
795 x = int.from_bytes(_urandom(numbytes), 'big')
796 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000797
Victor Stinner9f5fe792020-04-17 19:05:35 +0200798 def randbytes(self, n):
799 """Generate n random bytes."""
800 # os.urandom(n) fails with ValueError for n < 0
801 # and returns an empty bytes string for n == 0.
802 return _urandom(n)
803
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000804 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000805 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000806 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000807
808 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000809 "Method should not be called for a system random number generator."
810 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000811 getstate = setstate = _notimplemented
812
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700813
Tim Peterscd804102001-01-25 20:25:57 +0000814## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000815
Raymond Hettinger62297132003-08-30 01:24:19 +0000816def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000817 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000818 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000819 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000820 sqsum = 0.0
821 smallest = 1e10
822 largest = -1e10
Victor Stinner8db5b542018-12-17 11:30:34 +0100823 t0 = time.perf_counter()
Tim Peters0c9886d2001-01-15 01:18:21 +0000824 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000825 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000826 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000827 sqsum = sqsum + x*x
828 smallest = min(x, smallest)
829 largest = max(x, largest)
Victor Stinner8db5b542018-12-17 11:30:34 +0100830 t1 = time.perf_counter()
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700831 print(round(t1 - t0, 3), 'sec,', end=' ')
832 avg = total / n
833 stddev = _sqrt(sqsum / n - avg * avg)
834 print('avg %g, stddev %g, min %g, max %g\n' % (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000835
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000836
837def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000838 _test_generator(N, random, ())
839 _test_generator(N, normalvariate, (0.0, 1.0))
840 _test_generator(N, lognormvariate, (0.0, 1.0))
841 _test_generator(N, vonmisesvariate, (0.0, 1.0))
842 _test_generator(N, gammavariate, (0.01, 1.0))
843 _test_generator(N, gammavariate, (0.1, 1.0))
844 _test_generator(N, gammavariate, (0.1, 2.0))
845 _test_generator(N, gammavariate, (0.5, 1.0))
846 _test_generator(N, gammavariate, (0.9, 1.0))
847 _test_generator(N, gammavariate, (1.0, 1.0))
848 _test_generator(N, gammavariate, (2.0, 1.0))
849 _test_generator(N, gammavariate, (20.0, 1.0))
850 _test_generator(N, gammavariate, (200.0, 1.0))
851 _test_generator(N, gauss, (0.0, 1.0))
852 _test_generator(N, betavariate, (3.0, 3.0))
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700853 _test_generator(N, triangular, (0.0, 1.0, 1.0 / 3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000854
Tim Peters715c4c42001-01-26 22:56:56 +0000855# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000856# as module-level functions. The functions share state across all uses
Miss Islington (bot)f1534d02020-06-13 10:23:48 -0700857# (both in the user's code and in the Python libraries), but that's fine
Raymond Hettinger40f62172002-12-29 23:03:38 +0000858# for most programs and is easier for the casual user than making them
859# instantiate their own Random() instance.
860
Tim Petersd7b5e882001-01-25 03:36:26 +0000861_inst = Random()
862seed = _inst.seed
863random = _inst.random
864uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000865triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000866randint = _inst.randint
867choice = _inst.choice
868randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000869sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000870shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700871choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000872normalvariate = _inst.normalvariate
873lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000874expovariate = _inst.expovariate
875vonmisesvariate = _inst.vonmisesvariate
876gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000877gauss = _inst.gauss
878betavariate = _inst.betavariate
879paretovariate = _inst.paretovariate
880weibullvariate = _inst.weibullvariate
881getstate = _inst.getstate
882setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000883getrandbits = _inst.getrandbits
Victor Stinner9f5fe792020-04-17 19:05:35 +0200884randbytes = _inst.randbytes
Tim Petersd7b5e882001-01-25 03:36:26 +0000885
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200886if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700887 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200888
889
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000890if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000891 _test()