blob: 8e94064c9c6123c5475a6c739e19d25244691411 [file] [log] [blame]
Guido van Rossume7b146f2000-02-04 15:28:42 +00001"""Random variable generators.
Guido van Rossumff03b1a1994-03-09 12:55:02 +00002
Tim Petersd7b5e882001-01-25 03:36:26 +00003 integers
4 --------
5 uniform within range
6
7 sequences
8 ---------
9 pick random element
Raymond Hettingerf24eb352002-11-12 17:41:57 +000010 pick random sample
Raymond Hettingere8f1e002016-09-06 17:15:29 -070011 pick weighted random sample
Tim Petersd7b5e882001-01-25 03:36:26 +000012 generate random permutation
13
Guido van Rossume7b146f2000-02-04 15:28:42 +000014 distributions on the real line:
15 ------------------------------
Tim Petersd7b5e882001-01-25 03:36:26 +000016 uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +000017 triangular
Guido van Rossume7b146f2000-02-04 15:28:42 +000018 normal (Gaussian)
19 lognormal
20 negative exponential
21 gamma
22 beta
Raymond Hettinger40f62172002-12-29 23:03:38 +000023 pareto
24 Weibull
Guido van Rossumff03b1a1994-03-09 12:55:02 +000025
Guido van Rossume7b146f2000-02-04 15:28:42 +000026 distributions on the circle (angles 0 to 2pi)
27 ---------------------------------------------
28 circular uniform
29 von Mises
30
Raymond Hettinger40f62172002-12-29 23:03:38 +000031General notes on the underlying Mersenne Twister core generator:
Guido van Rossume7b146f2000-02-04 15:28:42 +000032
Raymond Hettinger40f62172002-12-29 23:03:38 +000033* The period is 2**19937-1.
Thomas Wouters0e3f5912006-08-11 14:57:12 +000034* It is one of the most extensively tested generators in existence.
Thomas Wouters0e3f5912006-08-11 14:57:12 +000035* The random() method is implemented in C, executes in a single Python step,
36 and is, therefore, threadsafe.
Tim Peterse360d952001-01-26 10:00:39 +000037
Guido van Rossume7b146f2000-02-04 15:28:42 +000038"""
Guido van Rossumd03e1191998-05-29 17:51:31 +000039
Raymond Hettinger2f726e92003-10-05 09:09:15 +000040from warnings import warn as _warn
41from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
Raymond Hettinger91e27c22005-08-19 01:36:35 +000042from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
Tim Petersd7b5e882001-01-25 03:36:26 +000043from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
Raymond Hettingerc1c43ca2004-09-05 00:00:42 +000044from os import urandom as _urandom
Christian Heimesf1dc3ee2013-10-13 02:04:20 +020045from _collections_abc import Set as _Set, Sequence as _Sequence
Raymond Hettinger3fcf0022010-12-08 01:13:53 +000046from hashlib import sha512 as _sha512
Raymond Hettingere8f1e002016-09-06 17:15:29 -070047import itertools as _itertools
48import bisect as _bisect
Antoine Pitrou346cbd32017-05-27 17:50:54 +020049import os as _os
Guido van Rossumff03b1a1994-03-09 12:55:02 +000050
Raymond Hettingerf24eb352002-11-12 17:41:57 +000051__all__ = ["Random","seed","random","uniform","randint","choice","sample",
Skip Montanaro0de65802001-02-15 22:15:14 +000052 "randrange","shuffle","normalvariate","lognormvariate",
Christian Heimesfe337bf2008-03-23 21:54:12 +000053 "expovariate","vonmisesvariate","gammavariate","triangular",
Raymond Hettingerf8a52d32003-08-05 12:23:19 +000054 "gauss","betavariate","paretovariate","weibullvariate",
Raymond Hettinger28aa4a02016-09-07 00:08:44 -070055 "getstate","setstate", "getrandbits", "choices",
Raymond Hettinger23f12412004-09-13 22:23:21 +000056 "SystemRandom"]
Tim Petersd7b5e882001-01-25 03:36:26 +000057
58NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000059TWOPI = 2.0*_pi
Tim Petersd7b5e882001-01-25 03:36:26 +000060LOG4 = _log(4.0)
Tim Petersd7b5e882001-01-25 03:36:26 +000061SG_MAGICCONST = 1.0 + _log(4.5)
Raymond Hettinger2f726e92003-10-05 09:09:15 +000062BPF = 53 # Number of bits in a float
Tim Peters7c2a85b2004-08-31 02:19:55 +000063RECIP_BPF = 2**-BPF
Tim Petersd7b5e882001-01-25 03:36:26 +000064
Raymond Hettinger356a4592004-08-30 06:14:31 +000065
Tim Petersd7b5e882001-01-25 03:36:26 +000066# Translated by Guido van Rossum from C source provided by
Raymond Hettinger40f62172002-12-29 23:03:38 +000067# Adrian Baddeley. Adapted by Raymond Hettinger for use with
Raymond Hettinger3fa19d72004-08-31 01:05:15 +000068# the Mersenne Twister and os.urandom() core generators.
Tim Petersd7b5e882001-01-25 03:36:26 +000069
Raymond Hettinger145a4a02003-01-07 10:25:55 +000070import _random
Raymond Hettinger40f62172002-12-29 23:03:38 +000071
Raymond Hettinger145a4a02003-01-07 10:25:55 +000072class Random(_random.Random):
Raymond Hettingerc32f0332002-05-23 19:44:49 +000073 """Random number generator base class used by bound module functions.
74
75 Used to instantiate instances of Random to get generators that don't
Raymond Hettinger28de64f2008-01-13 23:40:30 +000076 share state.
Raymond Hettingerc32f0332002-05-23 19:44:49 +000077
78 Class Random can also be subclassed if you want to use a different basic
79 generator of your own devising: in that case, override the following
Raymond Hettinger28de64f2008-01-13 23:40:30 +000080 methods: random(), seed(), getstate(), and setstate().
Benjamin Petersond18de0e2008-07-31 20:21:46 +000081 Optionally, implement a getrandbits() method so that randrange()
Raymond Hettinger2f726e92003-10-05 09:09:15 +000082 can cover arbitrarily large ranges.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +000083
Raymond Hettingerc32f0332002-05-23 19:44:49 +000084 """
Tim Petersd7b5e882001-01-25 03:36:26 +000085
Christian Heimescbf3b5c2007-12-03 21:02:03 +000086 VERSION = 3 # used by getstate/setstate
Tim Petersd7b5e882001-01-25 03:36:26 +000087
88 def __init__(self, x=None):
89 """Initialize an instance.
90
91 Optional argument x controls seeding, as for Random.seed().
92 """
93
94 self.seed(x)
Raymond Hettinger40f62172002-12-29 23:03:38 +000095 self.gauss_next = None
Tim Petersd7b5e882001-01-25 03:36:26 +000096
Raymond Hettingerf763a722010-09-07 00:38:15 +000097 def seed(self, a=None, version=2):
Tim Peters0de88fc2001-02-01 04:59:18 +000098 """Initialize internal state from hashable object.
Tim Petersd7b5e882001-01-25 03:36:26 +000099
Raymond Hettinger23f12412004-09-13 22:23:21 +0000100 None or no argument seeds from current time or from an operating
101 system specific randomness source if available.
Tim Peters0de88fc2001-02-01 04:59:18 +0000102
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000103 If *a* is an int, all bits are used.
Raymond Hettingerf763a722010-09-07 00:38:15 +0000104
Raymond Hettinger16eb8272016-09-04 11:17:28 -0700105 For version 2 (the default), all of the bits are used if *a* is a str,
106 bytes, or bytearray. For version 1 (provided for reproducing random
107 sequences from older versions of Python), the algorithm for str and
108 bytes generates a narrower range of seeds.
109
Tim Petersd7b5e882001-01-25 03:36:26 +0000110 """
111
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700112 if version == 1 and isinstance(a, (str, bytes)):
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700113 a = a.decode('latin-1') if isinstance(a, bytes) else a
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700114 x = ord(a[0]) << 7 if a else 0
Raymond Hettinger132a7d72017-09-17 09:04:30 -0700115 for c in map(ord, a):
116 x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
Raymond Hettingerc7bab7c2016-08-31 15:01:08 -0700117 x ^= len(a)
118 a = -2 if x == -1 else x
119
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700120 if version == 2 and isinstance(a, (str, bytes, bytearray)):
121 if isinstance(a, str):
122 a = a.encode()
123 a += _sha512(a).digest()
124 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000125
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000126 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000127 self.gauss_next = None
128
Tim Peterscd804102001-01-25 20:25:57 +0000129 def getstate(self):
130 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000131 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000132
133 def setstate(self, state):
134 """Restore internal state from object returned by getstate()."""
135 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000136 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000137 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000138 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000139 elif version == 2:
140 version, internalstate, self.gauss_next = state
141 # In version 2, the state was saved as signed ints, which causes
142 # inconsistencies between 32/64-bit systems. The state is
143 # really unsigned 32-bit ints, so we convert negative ints from
144 # version 2 to positive longs for version 3.
145 try:
Raymond Hettingerc585eec2010-09-07 15:00:15 +0000146 internalstate = tuple(x % (2**32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000147 except ValueError as e:
148 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000149 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000150 else:
151 raise ValueError("state with version %s passed to "
152 "Random.setstate() of version %s" %
153 (version, self.VERSION))
154
Tim Peterscd804102001-01-25 20:25:57 +0000155## ---- Methods below this point do not need to be overridden when
156## ---- subclassing for the purpose of using a different core generator.
157
158## -------------------- pickle support -------------------
159
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400160 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
161 # longer called; we leave it here because it has been here since random was
162 # rewritten back in 2001 and why risk breaking something.
Tim Peterscd804102001-01-25 20:25:57 +0000163 def __getstate__(self): # for pickle
164 return self.getstate()
165
166 def __setstate__(self, state): # for pickle
167 self.setstate(state)
168
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000169 def __reduce__(self):
170 return self.__class__, (), self.getstate()
171
Tim Peterscd804102001-01-25 20:25:57 +0000172## -------------------- integer methods -------------------
173
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700174 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000175 """Choose a random item from range(start, stop[, step]).
176
177 This fixes the problem with randint() which includes the
178 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000179
Tim Petersd7b5e882001-01-25 03:36:26 +0000180 """
181
182 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000183 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700184 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000185 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000186 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000187 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000188 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000189 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000190 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000191
192 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700193 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000194 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000195 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000196 width = istop - istart
197 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000198 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000199 if step == 1:
Collin Winterce36ad82007-08-30 01:19:48 +0000200 raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000201
202 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700203 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000204 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000205 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000206 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000207 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000208 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000209 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000210 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000211 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000212
213 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000214 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000215
Raymond Hettinger05156612010-09-07 04:44:52 +0000216 return istart + istep*self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000217
218 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000219 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000220 """
221
222 return self.randrange(a, b+1)
223
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000224 def _randbelow(self, n, int=int, maxsize=1<<BPF, type=type,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000225 Method=_MethodType, BuiltinMethod=_BuiltinMethodType):
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000226 "Return a random int in the range [0,n). Raises ValueError if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000227
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700228 random = self.random
Raymond Hettingerc3246972010-09-07 09:32:57 +0000229 getrandbits = self.getrandbits
230 # Only call self.getrandbits if the original random() builtin method
231 # has not been overridden or if a new getrandbits() was supplied.
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700232 if type(random) is BuiltinMethod or type(getrandbits) is Method:
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000233 k = n.bit_length() # don't use (n-1) here because n can be 1
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000234 r = getrandbits(k) # 0 <= r < 2**k
Raymond Hettingerc3246972010-09-07 09:32:57 +0000235 while r >= n:
236 r = getrandbits(k)
237 return r
Martin Pantere26da7c2016-06-02 10:07:09 +0000238 # There's an overridden random() method but no new getrandbits() method,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000239 # so we can only use random() from here.
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000240 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000241 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000242 "enough bits to choose from a population range this large.\n"
243 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000244 return int(random() * n)
Miss Islington (bot)baf304e2018-04-05 09:02:12 -0700245 if n == 0:
246 raise ValueError("Boundary cannot be zero")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000247 rem = maxsize % n
248 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
249 r = random()
250 while r >= limit:
251 r = random()
252 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000253
Tim Peterscd804102001-01-25 20:25:57 +0000254## -------------------- sequence methods -------------------
255
Tim Petersd7b5e882001-01-25 03:36:26 +0000256 def choice(self, seq):
257 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000258 try:
259 i = self._randbelow(len(seq))
260 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800261 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000262 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000263
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700264 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100265 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000266
Antoine Pitrou5e394332012-11-04 02:10:33 +0100267 Optional argument random is a 0-argument function returning a
268 random float in [0.0, 1.0); if it is the default None, the
269 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700270
Tim Petersd7b5e882001-01-25 03:36:26 +0000271 """
272
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700273 if random is None:
274 randbelow = self._randbelow
275 for i in reversed(range(1, len(x))):
276 # pick an element in x[:i+1] with which to exchange x[i]
277 j = randbelow(i+1)
278 x[i], x[j] = x[j], x[i]
279 else:
280 _int = int
281 for i in reversed(range(1, len(x))):
282 # pick an element in x[:i+1] with which to exchange x[i]
283 j = _int(random() * (i+1))
284 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000285
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000286 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000287 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000288
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000289 Returns a new list containing elements from the population while
290 leaving the original population unchanged. The resulting list is
291 in selection order so that all sub-slices will also be valid random
292 samples. This allows raffle winners (the sample) to be partitioned
293 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000294
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000295 Members of the population need not be hashable or unique. If the
296 population contains repeats, then each occurrence is a possible
297 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000298
Guido van Rossum805365e2007-05-07 22:24:25 +0000299 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000300 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000301 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000302 """
303
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000304 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000305 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000306
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000307 # When the number of selections is small compared to the
308 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000309 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000310 # a larger number of selections, the pool tracking method is
311 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000312 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000313
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000314 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000315 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000316 if not isinstance(population, _Sequence):
317 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000318 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000319 n = len(population)
320 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800321 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000322 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000323 setsize = 21 # size of a small set minus size of an empty list
324 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000325 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000326 if n <= setsize:
327 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000328 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000329 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000330 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000331 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000332 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000333 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000334 selected = set()
335 selected_add = selected.add
336 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000337 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000338 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000339 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000340 selected_add(j)
341 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000342 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000343
Raymond Hettinger9016f282016-09-26 21:45:57 -0700344 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700345 """Return a k sized list of population elements chosen with replacement.
346
347 If the relative weights or cumulative weights are not specified,
348 the selections are made with equal probability.
349
350 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700351 random = self.random
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700352 if cum_weights is None:
353 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700354 _int = int
355 total = len(population)
356 return [population[_int(random() * total)] for i in range(k)]
Raymond Hettinger8567e582016-11-01 22:23:11 -0700357 cum_weights = list(_itertools.accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700358 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500359 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700360 if len(cum_weights) != len(population):
361 raise ValueError('The number of weights does not match the population')
362 bisect = _bisect.bisect
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700363 total = cum_weights[-1]
Miss Islington (bot)0eaf7b92018-06-27 01:53:04 -0700364 hi = len(cum_weights) - 1
365 return [population[bisect(cum_weights, random() * total, 0, hi)]
366 for i in range(k)]
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700367
Tim Peterscd804102001-01-25 20:25:57 +0000368## -------------------- real-valued distributions -------------------
369
370## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000371
372 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000373 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000374 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000375
Christian Heimesfe337bf2008-03-23 21:54:12 +0000376## -------------------- triangular --------------------
377
378 def triangular(self, low=0.0, high=1.0, mode=None):
379 """Triangular distribution.
380
381 Continuous distribution bounded by given lower and upper limits,
382 and having a given mode value in-between.
383
384 http://en.wikipedia.org/wiki/Triangular_distribution
385
386 """
387 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700388 try:
389 c = 0.5 if mode is None else (mode - low) / (high - low)
390 except ZeroDivisionError:
391 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000392 if u > c:
393 u = 1.0 - u
394 c = 1.0 - c
395 low, high = high, low
Raymond Hettingerf5ea83f2017-09-04 16:51:06 -0700396 return low + (high - low) * _sqrt(u * c)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000397
Tim Peterscd804102001-01-25 20:25:57 +0000398## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000399
Tim Petersd7b5e882001-01-25 03:36:26 +0000400 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000401 """Normal distribution.
402
403 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000404
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000405 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000406 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000407
Tim Petersd7b5e882001-01-25 03:36:26 +0000408 # Uses Kinderman and Monahan method. Reference: Kinderman,
409 # A.J. and Monahan, J.F., "Computer generation of random
410 # variables using the ratio of uniform deviates", ACM Trans
411 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000412
Tim Petersd7b5e882001-01-25 03:36:26 +0000413 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000414 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000415 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000416 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000417 z = NV_MAGICCONST*(u1-0.5)/u2
418 zz = z*z/4.0
419 if zz <= -_log(u2):
420 break
421 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000422
Tim Peterscd804102001-01-25 20:25:57 +0000423## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000424
425 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000426 """Log normal distribution.
427
428 If you take the natural logarithm of this distribution, you'll get a
429 normal distribution with mean mu and standard deviation sigma.
430 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000431
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000432 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000433 return _exp(self.normalvariate(mu, sigma))
434
Tim Peterscd804102001-01-25 20:25:57 +0000435## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000436
437 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000438 """Exponential distribution.
439
Mark Dickinson2f947362009-01-07 17:54:07 +0000440 lambd is 1.0 divided by the desired mean. It should be
441 nonzero. (The parameter would be called "lambda", but that is
442 a reserved word in Python.) Returned values range from 0 to
443 positive infinity if lambd is positive, and from negative
444 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000445
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000446 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000447 # lambd: rate lambd = 1/mean
448 # ('lambda' is a Python reserved word)
449
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200450 # we use 1-random() instead of random() to preclude the
451 # possibility of taking the log of zero.
452 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000453
Tim Peterscd804102001-01-25 20:25:57 +0000454## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000455
Tim Petersd7b5e882001-01-25 03:36:26 +0000456 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000457 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000458
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000459 mu is the mean angle, expressed in radians between 0 and 2*pi, and
460 kappa is the concentration parameter, which must be greater than or
461 equal to zero. If kappa is equal to zero, this distribution reduces
462 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000463
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000464 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000465 # mu: mean angle (in radians between 0 and 2*pi)
466 # kappa: concentration parameter kappa (>= 0)
467 # if kappa = 0 generate uniform random angle
468
469 # Based upon an algorithm published in: Fisher, N.I.,
470 # "Statistical Analysis of Circular Data", Cambridge
471 # University Press, 1993.
472
473 # Thanks to Magnus Kessler for a correction to the
474 # implementation of step 4.
475
476 random = self.random
477 if kappa <= 1e-6:
478 return TWOPI * random()
479
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200480 s = 0.5 / kappa
481 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000482
Raymond Hettinger42406e62005-04-30 09:02:51 +0000483 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000484 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000485 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000486
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200487 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000488 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200489 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000490 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000491
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200492 q = 1.0 / r
493 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000494 u3 = random()
495 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000496 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000497 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000498 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000499
500 return theta
501
Tim Peterscd804102001-01-25 20:25:57 +0000502## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000503
504 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000505 """Gamma distribution. Not the gamma function!
506
507 Conditions on the parameters are alpha > 0 and beta > 0.
508
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700509 The probability distribution function is:
510
511 x ** (alpha - 1) * math.exp(-x / beta)
512 pdf(x) = --------------------------------------
513 math.gamma(alpha) * beta ** alpha
514
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000515 """
Tim Peters8ac14952002-05-23 15:15:30 +0000516
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000517 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000518
Guido van Rossum570764d2002-05-14 14:08:12 +0000519 # Warning: a few older sources define the gamma distribution in terms
520 # of alpha > -1.0
521 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000522 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000523
Tim Petersd7b5e882001-01-25 03:36:26 +0000524 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000525 if alpha > 1.0:
526
527 # Uses R.C.H. Cheng, "The generation of Gamma
528 # variables with non-integral shape parameters",
529 # Applied Statistics, (1977), 26, No. 1, p71-74
530
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000531 ainv = _sqrt(2.0 * alpha - 1.0)
532 bbb = alpha - LOG4
533 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000534
Raymond Hettinger42406e62005-04-30 09:02:51 +0000535 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000536 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000537 if not 1e-7 < u1 < .9999999:
538 continue
539 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000540 v = _log(u1/(1.0-u1))/ainv
541 x = alpha*_exp(v)
542 z = u1*u1*u2
543 r = bbb+ccc*v-x
544 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000545 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000546
547 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100548 # expovariate(1/beta)
Tim Petersd7b5e882001-01-25 03:36:26 +0000549 u = random()
550 while u <= 1e-7:
551 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000552 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000553
554 else: # alpha is between 0 and 1 (exclusive)
555
556 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
557
Raymond Hettinger42406e62005-04-30 09:02:51 +0000558 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000559 u = random()
560 b = (_e + alpha)/_e
561 p = b*u
562 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000563 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000564 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000565 x = -_log((b-p)/alpha)
566 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000567 if p > 1.0:
568 if u1 <= x ** (alpha - 1.0):
569 break
570 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000571 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000572 return x * beta
573
Tim Peterscd804102001-01-25 20:25:57 +0000574## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000575
Tim Petersd7b5e882001-01-25 03:36:26 +0000576 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000577 """Gaussian distribution.
578
579 mu is the mean, and sigma is the standard deviation. This is
580 slightly faster than the normalvariate() function.
581
582 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000583
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000584 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000585
Tim Petersd7b5e882001-01-25 03:36:26 +0000586 # When x and y are two variables from [0, 1), uniformly
587 # distributed, then
588 #
589 # cos(2*pi*x)*sqrt(-2*log(1-y))
590 # sin(2*pi*x)*sqrt(-2*log(1-y))
591 #
592 # are two *independent* variables with normal distribution
593 # (mu = 0, sigma = 1).
594 # (Lambert Meertens)
595 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000596
Tim Petersd7b5e882001-01-25 03:36:26 +0000597 # Multithreading note: When two threads call this function
598 # simultaneously, it is possible that they will receive the
599 # same return value. The window is very small though. To
600 # avoid this, you have to use a lock around all calls. (I
601 # didn't want to slow this down in the serial case by using a
602 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000603
Tim Petersd7b5e882001-01-25 03:36:26 +0000604 random = self.random
605 z = self.gauss_next
606 self.gauss_next = None
607 if z is None:
608 x2pi = random() * TWOPI
609 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
610 z = _cos(x2pi) * g2rad
611 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000612
Tim Petersd7b5e882001-01-25 03:36:26 +0000613 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000614
Tim Peterscd804102001-01-25 20:25:57 +0000615## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000616## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300617## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000618## for Ivan Frohne's insightful analysis of why the original implementation:
619##
620## def betavariate(self, alpha, beta):
621## # Discrete Event Simulation in C, pp 87-88.
622##
623## y = self.expovariate(alpha)
624## z = self.expovariate(1.0/beta)
625## return z/(y+z)
626##
627## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000628
Tim Petersd7b5e882001-01-25 03:36:26 +0000629 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000630 """Beta distribution.
631
Thomas Woutersb2137042007-02-01 18:02:27 +0000632 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000633 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000634
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000635 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000636
Tim Peters85e2e472001-01-26 06:49:56 +0000637 # This version due to Janne Sinkkonen, and matches all the std
638 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300639 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000640 if y == 0:
641 return 0.0
642 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300643 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000644
Tim Peterscd804102001-01-25 20:25:57 +0000645## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000646
Tim Petersd7b5e882001-01-25 03:36:26 +0000647 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000648 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000649 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000650
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000651 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000652 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000653
Tim Peterscd804102001-01-25 20:25:57 +0000654## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000655
Tim Petersd7b5e882001-01-25 03:36:26 +0000656 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000657 """Weibull distribution.
658
659 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000660
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000661 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000662 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000663
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000664 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000665 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000666
Raymond Hettinger23f12412004-09-13 22:23:21 +0000667## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000668
Raymond Hettinger23f12412004-09-13 22:23:21 +0000669class SystemRandom(Random):
670 """Alternate random number generator using sources provided
671 by the operating system (such as /dev/urandom on Unix or
672 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000673
674 Not available on all systems (see os.urandom() for details).
675 """
676
677 def random(self):
678 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000679 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000680
681 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300682 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000683 if k <= 0:
684 raise ValueError('number of bits must be greater than zero')
685 if k != int(k):
686 raise TypeError('number of bits should be an integer')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000687 numbytes = (k + 7) // 8 # bits / 8 and rounded up
688 x = int.from_bytes(_urandom(numbytes), 'big')
689 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000690
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000691 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000692 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000693 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000694
695 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000696 "Method should not be called for a system random number generator."
697 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000698 getstate = setstate = _notimplemented
699
Tim Peterscd804102001-01-25 20:25:57 +0000700## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000701
Raymond Hettinger62297132003-08-30 01:24:19 +0000702def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000703 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000704 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000705 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000706 sqsum = 0.0
707 smallest = 1e10
708 largest = -1e10
709 t0 = time.time()
710 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000711 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000712 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000713 sqsum = sqsum + x*x
714 smallest = min(x, smallest)
715 largest = max(x, largest)
716 t1 = time.time()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000717 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000718 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000719 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100720 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000721 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000722
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000723
724def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000725 _test_generator(N, random, ())
726 _test_generator(N, normalvariate, (0.0, 1.0))
727 _test_generator(N, lognormvariate, (0.0, 1.0))
728 _test_generator(N, vonmisesvariate, (0.0, 1.0))
729 _test_generator(N, gammavariate, (0.01, 1.0))
730 _test_generator(N, gammavariate, (0.1, 1.0))
731 _test_generator(N, gammavariate, (0.1, 2.0))
732 _test_generator(N, gammavariate, (0.5, 1.0))
733 _test_generator(N, gammavariate, (0.9, 1.0))
734 _test_generator(N, gammavariate, (1.0, 1.0))
735 _test_generator(N, gammavariate, (2.0, 1.0))
736 _test_generator(N, gammavariate, (20.0, 1.0))
737 _test_generator(N, gammavariate, (200.0, 1.0))
738 _test_generator(N, gauss, (0.0, 1.0))
739 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000740 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000741
Tim Peters715c4c42001-01-26 22:56:56 +0000742# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000743# as module-level functions. The functions share state across all uses
744#(both in the user's code and in the Python libraries), but that's fine
745# for most programs and is easier for the casual user than making them
746# instantiate their own Random() instance.
747
Tim Petersd7b5e882001-01-25 03:36:26 +0000748_inst = Random()
749seed = _inst.seed
750random = _inst.random
751uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000752triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000753randint = _inst.randint
754choice = _inst.choice
755randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000756sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000757shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700758choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000759normalvariate = _inst.normalvariate
760lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000761expovariate = _inst.expovariate
762vonmisesvariate = _inst.vonmisesvariate
763gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000764gauss = _inst.gauss
765betavariate = _inst.betavariate
766paretovariate = _inst.paretovariate
767weibullvariate = _inst.weibullvariate
768getstate = _inst.getstate
769setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000770getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000771
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200772if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700773 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200774
775
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000776if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000777 _test()