blob: 53981f3e4f89bd0e21f31114ae112c753fb2240a [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 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
Raymond Hettingerf24eb352002-11-12 17:41:57 +000057__all__ = ["Random","seed","random","uniform","randint","choice","sample",
Skip Montanaro0de65802001-02-15 22:15:14 +000058 "randrange","shuffle","normalvariate","lognormvariate",
Christian Heimesfe337bf2008-03-23 21:54:12 +000059 "expovariate","vonmisesvariate","gammavariate","triangular",
Raymond Hettingerf8a52d32003-08-05 12:23:19 +000060 "gauss","betavariate","paretovariate","weibullvariate",
Raymond Hettinger28aa4a02016-09-07 00:08:44 -070061 "getstate","setstate", "getrandbits", "choices",
Raymond Hettinger23f12412004-09-13 22:23:21 +000062 "SystemRandom"]
Tim Petersd7b5e882001-01-25 03:36:26 +000063
64NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000065TWOPI = 2.0*_pi
Tim Petersd7b5e882001-01-25 03:36:26 +000066LOG4 = _log(4.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000067SG_MAGICCONST = 1.0 + _log(4.5)
Raymond Hettinger2f726e92003-10-05 09:09:15 +000068BPF = 53 # Number of bits in a float
Tim Peters7c2a85b2004-08-31 02:19:55 +000069RECIP_BPF = 2**-BPF
Tim Petersd7b5e882001-01-25 03:36:26 +000070
Raymond Hettinger356a4592004-08-30 06:14:31 +000071
Tim Petersd7b5e882001-01-25 03:36:26 +000072# Translated by Guido van Rossum from C source provided by
Raymond Hettinger40f62172002-12-29 23:03:38 +000073# Adrian Baddeley. Adapted by Raymond Hettinger for use with
Raymond Hettinger3fa19d72004-08-31 01:05:15 +000074# the Mersenne Twister and os.urandom() core generators.
Tim Petersd7b5e882001-01-25 03:36:26 +000075
Raymond Hettinger145a4a02003-01-07 10:25:55 +000076import _random
Raymond Hettinger40f62172002-12-29 23:03:38 +000077
Raymond Hettinger145a4a02003-01-07 10:25:55 +000078class Random(_random.Random):
Raymond Hettingerc32f0332002-05-23 19:44:49 +000079 """Random number generator base class used by bound module functions.
80
81 Used to instantiate instances of Random to get generators that don't
Raymond Hettinger28de64f2008-01-13 23:40:30 +000082 share state.
Raymond Hettingerc32f0332002-05-23 19:44:49 +000083
84 Class Random can also be subclassed if you want to use a different basic
85 generator of your own devising: in that case, override the following
Raymond Hettinger28de64f2008-01-13 23:40:30 +000086 methods: random(), seed(), getstate(), and setstate().
Benjamin Petersond18de0e2008-07-31 20:21:46 +000087 Optionally, implement a getrandbits() method so that randrange()
Raymond Hettinger2f726e92003-10-05 09:09:15 +000088 can cover arbitrarily large ranges.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +000089
Raymond Hettingerc32f0332002-05-23 19:44:49 +000090 """
Tim Petersd7b5e882001-01-25 03:36:26 +000091
Christian Heimescbf3b5c2007-12-03 21:02:03 +000092 VERSION = 3 # used by getstate/setstate
Tim Petersd7b5e882001-01-25 03:36:26 +000093
94 def __init__(self, x=None):
95 """Initialize an instance.
96
97 Optional argument x controls seeding, as for Random.seed().
98 """
99
100 self.seed(x)
Raymond Hettinger40f62172002-12-29 23:03:38 +0000101 self.gauss_next = None
Tim Petersd7b5e882001-01-25 03:36:26 +0000102
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200103 def __init_subclass__(cls, **kwargs):
104 """Control how subclasses generate random integers.
105
106 The algorithm a subclass can use depends on the random() and/or
107 getrandbits() implementation available to it and determines
108 whether it can generate random integers from arbitrarily large
109 ranges.
110 """
111
Serhiy Storchakaec1622d2018-05-08 15:45:15 +0300112 for c in cls.__mro__:
113 if '_randbelow' in c.__dict__:
114 # just inherit it
115 break
116 if 'getrandbits' in c.__dict__:
117 cls._randbelow = cls._randbelow_with_getrandbits
118 break
119 if 'random' in c.__dict__:
120 cls._randbelow = cls._randbelow_without_getrandbits
121 break
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200122
Raymond Hettingerf763a722010-09-07 00:38:15 +0000123 def seed(self, a=None, version=2):
Tim Peters0de88fc2001-02-01 04:59:18 +0000124 """Initialize internal state from hashable object.
Tim Petersd7b5e882001-01-25 03:36:26 +0000125
Raymond Hettinger23f12412004-09-13 22:23:21 +0000126 None or no argument seeds from current time or from an operating
127 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000128
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000129 If *a* is an int, all bits are used.
Raymond Hettingerf763a722010-09-07 00:38:15 +0000130
Raymond Hettinger16eb8272016-09-04 11:17:28 -0700131 For version 2 (the default), all of the bits are used if *a* is a str,
132 bytes, or bytearray. For version 1 (provided for reproducing random
133 sequences from older versions of Python), the algorithm for str and
134 bytes generates a narrower range of seeds.
135
Tim Petersd7b5e882001-01-25 03:36:26 +0000136 """
137
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700138 if version == 1 and isinstance(a, (str, bytes)):
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700139 a = a.decode('latin-1') if isinstance(a, bytes) else a
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700140 x = ord(a[0]) << 7 if a else 0
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700141 for c in map(ord, a):
142 x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700143 x ^= len(a)
144 a = -2 if x == -1 else x
145
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700146 if version == 2 and isinstance(a, (str, bytes, bytearray)):
147 if isinstance(a, str):
148 a = a.encode()
149 a += _sha512(a).digest()
150 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000151
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000152 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000153 self.gauss_next = None
154
Tim Peterscd804102001-01-25 20:25:57 +0000155 def getstate(self):
156 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000157 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000158
159 def setstate(self, state):
160 """Restore internal state from object returned by getstate()."""
161 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000162 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000163 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000164 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000165 elif version == 2:
166 version, internalstate, self.gauss_next = state
167 # In version 2, the state was saved as signed ints, which causes
168 # inconsistencies between 32/64-bit systems. The state is
169 # really unsigned 32-bit ints, so we convert negative ints from
170 # version 2 to positive longs for version 3.
171 try:
Raymond Hettingerc585eec2010-09-07 15:00:15 +0000172 internalstate = tuple(x % (2**32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000173 except ValueError as e:
174 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000175 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000176 else:
177 raise ValueError("state with version %s passed to "
178 "Random.setstate() of version %s" %
179 (version, self.VERSION))
180
Tim Peterscd804102001-01-25 20:25:57 +0000181## ---- Methods below this point do not need to be overridden when
182## ---- subclassing for the purpose of using a different core generator.
183
184## -------------------- pickle support -------------------
185
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400186 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
187 # longer called; we leave it here because it has been here since random was
188 # rewritten back in 2001 and why risk breaking something.
Tim Peterscd804102001-01-25 20:25:57 +0000189 def __getstate__(self): # for pickle
190 return self.getstate()
191
192 def __setstate__(self, state): # for pickle
193 self.setstate(state)
194
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000195 def __reduce__(self):
196 return self.__class__, (), self.getstate()
197
Tim Peterscd804102001-01-25 20:25:57 +0000198## -------------------- integer methods -------------------
199
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700200 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000201 """Choose a random item from range(start, stop[, step]).
202
203 This fixes the problem with randint() which includes the
204 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000205
Tim Petersd7b5e882001-01-25 03:36:26 +0000206 """
207
208 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000209 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700210 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000211 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000212 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000213 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000214 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000215 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000216 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000217
218 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700219 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000220 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000221 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000222 width = istop - istart
223 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000224 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000225 if step == 1:
Kumar Akshay2433a2a2019-01-22 00:49:59 +0530226 raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000227
228 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700229 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000230 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000231 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000232 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000233 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000234 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000235 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000236 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000237 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000238
239 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000240 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000241
Raymond Hettinger05156612010-09-07 04:44:52 +0000242 return istart + istep*self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000243
244 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000245 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000246 """
247
248 return self.randrange(a, b+1)
249
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200250 def _randbelow_with_getrandbits(self, n):
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000251 "Return a random int in the range [0,n). Raises ValueError if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000252
Raymond Hettingerc3246972010-09-07 09:32:57 +0000253 getrandbits = self.getrandbits
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200254 k = n.bit_length() # don't use (n-1) here because n can be 1
255 r = getrandbits(k) # 0 <= r < 2**k
256 while r >= n:
257 r = getrandbits(k)
258 return r
259
260 def _randbelow_without_getrandbits(self, n, int=int, maxsize=1<<BPF):
261 """Return a random int in the range [0,n). Raises ValueError if n==0.
262
263 The implementation does not use getrandbits, but only random.
264 """
265
266 random = self.random
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000267 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000268 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000269 "enough bits to choose from a population range this large.\n"
270 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000271 return int(random() * n)
Wolfgang Maier091e95e2018-04-05 17:19:44 +0200272 if n == 0:
273 raise ValueError("Boundary cannot be zero")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000274 rem = maxsize % n
275 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
276 r = random()
277 while r >= limit:
278 r = random()
279 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000280
Wolfgang Maierba3a87a2018-04-17 17:16:17 +0200281 _randbelow = _randbelow_with_getrandbits
282
Tim Peterscd804102001-01-25 20:25:57 +0000283## -------------------- sequence methods -------------------
284
Tim Petersd7b5e882001-01-25 03:36:26 +0000285 def choice(self, seq):
286 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000287 try:
288 i = self._randbelow(len(seq))
289 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800290 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000291 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000292
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700293 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100294 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000295
Antoine Pitrou5e394332012-11-04 02:10:33 +0100296 Optional argument random is a 0-argument function returning a
297 random float in [0.0, 1.0); if it is the default None, the
298 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700299
Tim Petersd7b5e882001-01-25 03:36:26 +0000300 """
301
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700302 if random is None:
303 randbelow = self._randbelow
304 for i in reversed(range(1, len(x))):
305 # pick an element in x[:i+1] with which to exchange x[i]
306 j = randbelow(i+1)
307 x[i], x[j] = x[j], x[i]
308 else:
309 _int = int
310 for i in reversed(range(1, len(x))):
311 # pick an element in x[:i+1] with which to exchange x[i]
312 j = _int(random() * (i+1))
313 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000314
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000315 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000316 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000317
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000318 Returns a new list containing elements from the population while
319 leaving the original population unchanged. The resulting list is
320 in selection order so that all sub-slices will also be valid random
321 samples. This allows raffle winners (the sample) to be partitioned
322 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000323
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000324 Members of the population need not be hashable or unique. If the
325 population contains repeats, then each occurrence is a possible
326 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000327
Guido van Rossum805365e2007-05-07 22:24:25 +0000328 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000329 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000330 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000331 """
332
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000333 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000334 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000335
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000336 # When the number of selections is small compared to the
337 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000338 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000339 # a larger number of selections, the pool tracking method is
340 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000341 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000342
Raymond Hettinger7fc633f2018-12-04 00:13:38 -0800343 # The number of calls to _randbelow() is kept at or near k, the
344 # theoretical minimum. This is important because running time
345 # is dominated by _randbelow() and because it extracts the
346 # least entropy from the underlying random number generators.
347
348 # Memory requirements are kept to the smaller of a k-length
349 # set or an n-length list.
350
351 # There are other sampling algorithms that do not require
352 # auxiliary memory, but they were rejected because they made
353 # too many calls to _randbelow(), making them slower and
354 # causing them to eat more entropy than necessary.
355
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000356 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000357 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000358 if not isinstance(population, _Sequence):
359 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000360 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000361 n = len(population)
362 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800363 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000364 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000365 setsize = 21 # size of a small set minus size of an empty list
366 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000367 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000368 if n <= setsize:
369 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000370 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000371 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000372 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000373 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000374 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000375 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000376 selected = set()
377 selected_add = selected.add
378 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000379 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000380 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000381 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000382 selected_add(j)
383 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000384 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000385
Raymond Hettinger9016f282016-09-26 21:45:57 -0700386 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700387 """Return a k sized list of population elements chosen with replacement.
388
389 If the relative weights or cumulative weights are not specified,
390 the selections are made with equal probability.
391
392 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700393 random = self.random
Raymond Hettingere69cd162018-07-04 15:28:20 -0700394 n = len(population)
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700395 if cum_weights is None:
396 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700397 _int = int
Raymond Hettinger0a18e052018-11-09 02:39:50 -0800398 n += 0.0 # convert to float for a small speed improvement
Raymond Hettinger53822032019-02-16 13:30:51 -0800399 return [population[_int(random() * n)] for i in _repeat(None, k)]
Raymond Hettingercfd31f02019-02-13 02:04:17 -0800400 cum_weights = list(_accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700401 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500402 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere69cd162018-07-04 15:28:20 -0700403 if len(cum_weights) != n:
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700404 raise ValueError('The number of weights does not match the population')
Raymond Hettingercfd31f02019-02-13 02:04:17 -0800405 bisect = _bisect
Raymond Hettinger0a18e052018-11-09 02:39:50 -0800406 total = cum_weights[-1] + 0.0 # convert to float
Raymond Hettingere69cd162018-07-04 15:28:20 -0700407 hi = n - 1
Raymond Hettingerddf71712018-06-27 01:08:31 -0700408 return [population[bisect(cum_weights, random() * total, 0, hi)]
Raymond Hettinger53822032019-02-16 13:30:51 -0800409 for i in _repeat(None, k)]
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700410
Tim Peterscd804102001-01-25 20:25:57 +0000411## -------------------- real-valued distributions -------------------
412
413## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000414
415 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000416 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000417 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000418
Christian Heimesfe337bf2008-03-23 21:54:12 +0000419## -------------------- triangular --------------------
420
421 def triangular(self, low=0.0, high=1.0, mode=None):
422 """Triangular distribution.
423
424 Continuous distribution bounded by given lower and upper limits,
425 and having a given mode value in-between.
426
427 http://en.wikipedia.org/wiki/Triangular_distribution
428
429 """
430 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700431 try:
432 c = 0.5 if mode is None else (mode - low) / (high - low)
433 except ZeroDivisionError:
434 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000435 if u > c:
436 u = 1.0 - u
437 c = 1.0 - c
438 low, high = high, low
Raymond Hettingerf5ea83f2017-09-04 16:51:06 -0700439 return low + (high - low) * _sqrt(u * c)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000440
Tim Peterscd804102001-01-25 20:25:57 +0000441## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000442
Tim Petersd7b5e882001-01-25 03:36:26 +0000443 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000444 """Normal distribution.
445
446 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000447
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000448 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000449 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000450
Tim Petersd7b5e882001-01-25 03:36:26 +0000451 # Uses Kinderman and Monahan method. Reference: Kinderman,
452 # A.J. and Monahan, J.F., "Computer generation of random
453 # variables using the ratio of uniform deviates", ACM Trans
454 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000455
Tim Petersd7b5e882001-01-25 03:36:26 +0000456 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000457 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000458 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000459 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000460 z = NV_MAGICCONST*(u1-0.5)/u2
461 zz = z*z/4.0
462 if zz <= -_log(u2):
463 break
464 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000465
Tim Peterscd804102001-01-25 20:25:57 +0000466## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000467
468 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000469 """Log normal distribution.
470
471 If you take the natural logarithm of this distribution, you'll get a
472 normal distribution with mean mu and standard deviation sigma.
473 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000474
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000475 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000476 return _exp(self.normalvariate(mu, sigma))
477
Tim Peterscd804102001-01-25 20:25:57 +0000478## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000479
480 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000481 """Exponential distribution.
482
Mark Dickinson2f947362009-01-07 17:54:07 +0000483 lambd is 1.0 divided by the desired mean. It should be
484 nonzero. (The parameter would be called "lambda", but that is
485 a reserved word in Python.) Returned values range from 0 to
486 positive infinity if lambd is positive, and from negative
487 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000488
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000489 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000490 # lambd: rate lambd = 1/mean
491 # ('lambda' is a Python reserved word)
492
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200493 # we use 1-random() instead of random() to preclude the
494 # possibility of taking the log of zero.
495 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000496
Tim Peterscd804102001-01-25 20:25:57 +0000497## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000498
Tim Petersd7b5e882001-01-25 03:36:26 +0000499 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000500 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000501
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000502 mu is the mean angle, expressed in radians between 0 and 2*pi, and
503 kappa is the concentration parameter, which must be greater than or
504 equal to zero. If kappa is equal to zero, this distribution reduces
505 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000506
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000507 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000508 # mu: mean angle (in radians between 0 and 2*pi)
509 # kappa: concentration parameter kappa (>= 0)
510 # if kappa = 0 generate uniform random angle
511
512 # Based upon an algorithm published in: Fisher, N.I.,
513 # "Statistical Analysis of Circular Data", Cambridge
514 # University Press, 1993.
515
516 # Thanks to Magnus Kessler for a correction to the
517 # implementation of step 4.
518
519 random = self.random
520 if kappa <= 1e-6:
521 return TWOPI * random()
522
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200523 s = 0.5 / kappa
524 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000525
Raymond Hettinger42406e62005-04-30 09:02:51 +0000526 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000527 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000528 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000529
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200530 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000531 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200532 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000533 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000534
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200535 q = 1.0 / r
536 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000537 u3 = random()
538 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000539 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000540 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000541 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000542
543 return theta
544
Tim Peterscd804102001-01-25 20:25:57 +0000545## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000546
547 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000548 """Gamma distribution. Not the gamma function!
549
550 Conditions on the parameters are alpha > 0 and beta > 0.
551
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700552 The probability distribution function is:
553
554 x ** (alpha - 1) * math.exp(-x / beta)
555 pdf(x) = --------------------------------------
556 math.gamma(alpha) * beta ** alpha
557
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000558 """
Tim Peters8ac14952002-05-23 15:15:30 +0000559
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000560 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000561
Guido van Rossum570764d2002-05-14 14:08:12 +0000562 # Warning: a few older sources define the gamma distribution in terms
563 # of alpha > -1.0
564 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000565 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000566
Tim Petersd7b5e882001-01-25 03:36:26 +0000567 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000568 if alpha > 1.0:
569
570 # Uses R.C.H. Cheng, "The generation of Gamma
571 # variables with non-integral shape parameters",
572 # Applied Statistics, (1977), 26, No. 1, p71-74
573
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000574 ainv = _sqrt(2.0 * alpha - 1.0)
575 bbb = alpha - LOG4
576 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000577
Raymond Hettinger42406e62005-04-30 09:02:51 +0000578 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000579 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000580 if not 1e-7 < u1 < .9999999:
581 continue
582 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000583 v = _log(u1/(1.0-u1))/ainv
584 x = alpha*_exp(v)
585 z = u1*u1*u2
586 r = bbb+ccc*v-x
587 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000588 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000589
590 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100591 # expovariate(1/beta)
leodema63d15222018-12-24 07:54:25 +0100592 return -_log(1.0 - random()) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000593
594 else: # alpha is between 0 and 1 (exclusive)
595
596 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
597
Raymond Hettinger42406e62005-04-30 09:02:51 +0000598 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000599 u = random()
600 b = (_e + alpha)/_e
601 p = b*u
602 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000603 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000604 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000605 x = -_log((b-p)/alpha)
606 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000607 if p > 1.0:
608 if u1 <= x ** (alpha - 1.0):
609 break
610 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000611 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000612 return x * beta
613
Tim Peterscd804102001-01-25 20:25:57 +0000614## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000615
Tim Petersd7b5e882001-01-25 03:36:26 +0000616 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000617 """Gaussian distribution.
618
619 mu is the mean, and sigma is the standard deviation. This is
620 slightly faster than the normalvariate() function.
621
622 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000623
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000624 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000625
Tim Petersd7b5e882001-01-25 03:36:26 +0000626 # When x and y are two variables from [0, 1), uniformly
627 # distributed, then
628 #
629 # cos(2*pi*x)*sqrt(-2*log(1-y))
630 # sin(2*pi*x)*sqrt(-2*log(1-y))
631 #
632 # are two *independent* variables with normal distribution
633 # (mu = 0, sigma = 1).
634 # (Lambert Meertens)
635 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000636
Tim Petersd7b5e882001-01-25 03:36:26 +0000637 # Multithreading note: When two threads call this function
638 # simultaneously, it is possible that they will receive the
639 # same return value. The window is very small though. To
640 # avoid this, you have to use a lock around all calls. (I
641 # didn't want to slow this down in the serial case by using a
642 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000643
Tim Petersd7b5e882001-01-25 03:36:26 +0000644 random = self.random
645 z = self.gauss_next
646 self.gauss_next = None
647 if z is None:
648 x2pi = random() * TWOPI
649 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
650 z = _cos(x2pi) * g2rad
651 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000652
Tim Petersd7b5e882001-01-25 03:36:26 +0000653 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000654
Tim Peterscd804102001-01-25 20:25:57 +0000655## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000656## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300657## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000658## for Ivan Frohne's insightful analysis of why the original implementation:
659##
660## def betavariate(self, alpha, beta):
661## # Discrete Event Simulation in C, pp 87-88.
662##
663## y = self.expovariate(alpha)
664## z = self.expovariate(1.0/beta)
665## return z/(y+z)
666##
667## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000668
Tim Petersd7b5e882001-01-25 03:36:26 +0000669 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000670 """Beta distribution.
671
Thomas Woutersb2137042007-02-01 18:02:27 +0000672 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000673 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000674
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000675 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000676
Tim Peters85e2e472001-01-26 06:49:56 +0000677 # This version due to Janne Sinkkonen, and matches all the std
678 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300679 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000680 if y == 0:
681 return 0.0
682 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300683 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000684
Tim Peterscd804102001-01-25 20:25:57 +0000685## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000686
Tim Petersd7b5e882001-01-25 03:36:26 +0000687 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000688 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000689 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000690
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000691 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000692 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000693
Tim Peterscd804102001-01-25 20:25:57 +0000694## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000695
Tim Petersd7b5e882001-01-25 03:36:26 +0000696 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000697 """Weibull distribution.
698
699 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000700
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000701 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000702 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000703
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000704 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000705 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000706
Raymond Hettinger23f12412004-09-13 22:23:21 +0000707## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000708
Raymond Hettinger23f12412004-09-13 22:23:21 +0000709class SystemRandom(Random):
710 """Alternate random number generator using sources provided
711 by the operating system (such as /dev/urandom on Unix or
712 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000713
714 Not available on all systems (see os.urandom() for details).
715 """
716
717 def random(self):
718 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000719 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000720
721 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300722 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000723 if k <= 0:
724 raise ValueError('number of bits must be greater than zero')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000725 numbytes = (k + 7) // 8 # bits / 8 and rounded up
726 x = int.from_bytes(_urandom(numbytes), 'big')
727 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000728
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000729 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000730 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000731 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000732
733 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000734 "Method should not be called for a system random number generator."
735 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000736 getstate = setstate = _notimplemented
737
Tim Peterscd804102001-01-25 20:25:57 +0000738## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000739
Raymond Hettinger62297132003-08-30 01:24:19 +0000740def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000741 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000742 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000743 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000744 sqsum = 0.0
745 smallest = 1e10
746 largest = -1e10
Victor Stinner8db5b542018-12-17 11:30:34 +0100747 t0 = time.perf_counter()
Tim Peters0c9886d2001-01-15 01:18:21 +0000748 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000749 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000750 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000751 sqsum = sqsum + x*x
752 smallest = min(x, smallest)
753 largest = max(x, largest)
Victor Stinner8db5b542018-12-17 11:30:34 +0100754 t1 = time.perf_counter()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000755 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000756 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000757 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100758 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000759 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000760
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000761
762def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000763 _test_generator(N, random, ())
764 _test_generator(N, normalvariate, (0.0, 1.0))
765 _test_generator(N, lognormvariate, (0.0, 1.0))
766 _test_generator(N, vonmisesvariate, (0.0, 1.0))
767 _test_generator(N, gammavariate, (0.01, 1.0))
768 _test_generator(N, gammavariate, (0.1, 1.0))
769 _test_generator(N, gammavariate, (0.1, 2.0))
770 _test_generator(N, gammavariate, (0.5, 1.0))
771 _test_generator(N, gammavariate, (0.9, 1.0))
772 _test_generator(N, gammavariate, (1.0, 1.0))
773 _test_generator(N, gammavariate, (2.0, 1.0))
774 _test_generator(N, gammavariate, (20.0, 1.0))
775 _test_generator(N, gammavariate, (200.0, 1.0))
776 _test_generator(N, gauss, (0.0, 1.0))
777 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000778 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000779
Tim Peters715c4c42001-01-26 22:56:56 +0000780# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000781# as module-level functions. The functions share state across all uses
782#(both in the user's code and in the Python libraries), but that's fine
783# for most programs and is easier for the casual user than making them
784# instantiate their own Random() instance.
785
Tim Petersd7b5e882001-01-25 03:36:26 +0000786_inst = Random()
787seed = _inst.seed
788random = _inst.random
789uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000790triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000791randint = _inst.randint
792choice = _inst.choice
793randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000794sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000795shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700796choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000797normalvariate = _inst.normalvariate
798lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000799expovariate = _inst.expovariate
800vonmisesvariate = _inst.vonmisesvariate
801gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000802gauss = _inst.gauss
803betavariate = _inst.betavariate
804paretovariate = _inst.paretovariate
805weibullvariate = _inst.weibullvariate
806getstate = _inst.getstate
807setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000808getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000809
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200810if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700811 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200812
813
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000814if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000815 _test()