blob: 91065b7e3037843fac2f2271afed1d234acea14c [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)
245 rem = maxsize % n
246 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
247 r = random()
248 while r >= limit:
249 r = random()
250 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000251
Tim Peterscd804102001-01-25 20:25:57 +0000252## -------------------- sequence methods -------------------
253
Tim Petersd7b5e882001-01-25 03:36:26 +0000254 def choice(self, seq):
255 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000256 try:
257 i = self._randbelow(len(seq))
258 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800259 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000260 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000261
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700262 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100263 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000264
Antoine Pitrou5e394332012-11-04 02:10:33 +0100265 Optional argument random is a 0-argument function returning a
266 random float in [0.0, 1.0); if it is the default None, the
267 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700268
Tim Petersd7b5e882001-01-25 03:36:26 +0000269 """
270
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700271 if random is None:
272 randbelow = self._randbelow
273 for i in reversed(range(1, len(x))):
274 # pick an element in x[:i+1] with which to exchange x[i]
275 j = randbelow(i+1)
276 x[i], x[j] = x[j], x[i]
277 else:
278 _int = int
279 for i in reversed(range(1, len(x))):
280 # pick an element in x[:i+1] with which to exchange x[i]
281 j = _int(random() * (i+1))
282 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000283
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000284 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000285 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000286
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000287 Returns a new list containing elements from the population while
288 leaving the original population unchanged. The resulting list is
289 in selection order so that all sub-slices will also be valid random
290 samples. This allows raffle winners (the sample) to be partitioned
291 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000292
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000293 Members of the population need not be hashable or unique. If the
294 population contains repeats, then each occurrence is a possible
295 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000296
Guido van Rossum805365e2007-05-07 22:24:25 +0000297 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000298 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000299 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000300 """
301
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000302 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000303 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000304
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000305 # When the number of selections is small compared to the
306 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000307 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000308 # a larger number of selections, the pool tracking method is
309 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000310 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000311
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000312 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000313 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000314 if not isinstance(population, _Sequence):
315 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000316 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000317 n = len(population)
318 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800319 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000320 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000321 setsize = 21 # size of a small set minus size of an empty list
322 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000323 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000324 if n <= setsize:
325 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000326 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000327 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000328 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000329 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000330 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000331 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000332 selected = set()
333 selected_add = selected.add
334 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000335 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000336 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000337 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000338 selected_add(j)
339 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000340 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000341
Raymond Hettinger9016f282016-09-26 21:45:57 -0700342 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700343 """Return a k sized list of population elements chosen with replacement.
344
345 If the relative weights or cumulative weights are not specified,
346 the selections are made with equal probability.
347
348 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700349 random = self.random
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700350 if cum_weights is None:
351 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700352 _int = int
353 total = len(population)
354 return [population[_int(random() * total)] for i in range(k)]
Raymond Hettinger8567e582016-11-01 22:23:11 -0700355 cum_weights = list(_itertools.accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700356 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500357 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700358 if len(cum_weights) != len(population):
359 raise ValueError('The number of weights does not match the population')
360 bisect = _bisect.bisect
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700361 total = cum_weights[-1]
362 return [population[bisect(cum_weights, random() * total)] for i in range(k)]
363
Tim Peterscd804102001-01-25 20:25:57 +0000364## -------------------- real-valued distributions -------------------
365
366## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000367
368 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000369 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000370 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000371
Christian Heimesfe337bf2008-03-23 21:54:12 +0000372## -------------------- triangular --------------------
373
374 def triangular(self, low=0.0, high=1.0, mode=None):
375 """Triangular distribution.
376
377 Continuous distribution bounded by given lower and upper limits,
378 and having a given mode value in-between.
379
380 http://en.wikipedia.org/wiki/Triangular_distribution
381
382 """
383 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700384 try:
385 c = 0.5 if mode is None else (mode - low) / (high - low)
386 except ZeroDivisionError:
387 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000388 if u > c:
389 u = 1.0 - u
390 c = 1.0 - c
391 low, high = high, low
Raymond Hettingerf5ea83f2017-09-04 16:51:06 -0700392 return low + (high - low) * _sqrt(u * c)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000393
Tim Peterscd804102001-01-25 20:25:57 +0000394## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000395
Tim Petersd7b5e882001-01-25 03:36:26 +0000396 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000397 """Normal distribution.
398
399 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000400
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000401 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000402 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000403
Tim Petersd7b5e882001-01-25 03:36:26 +0000404 # Uses Kinderman and Monahan method. Reference: Kinderman,
405 # A.J. and Monahan, J.F., "Computer generation of random
406 # variables using the ratio of uniform deviates", ACM Trans
407 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000408
Tim Petersd7b5e882001-01-25 03:36:26 +0000409 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000410 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000411 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000412 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000413 z = NV_MAGICCONST*(u1-0.5)/u2
414 zz = z*z/4.0
415 if zz <= -_log(u2):
416 break
417 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000418
Tim Peterscd804102001-01-25 20:25:57 +0000419## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000420
421 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000422 """Log normal distribution.
423
424 If you take the natural logarithm of this distribution, you'll get a
425 normal distribution with mean mu and standard deviation sigma.
426 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000427
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000428 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000429 return _exp(self.normalvariate(mu, sigma))
430
Tim Peterscd804102001-01-25 20:25:57 +0000431## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000432
433 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000434 """Exponential distribution.
435
Mark Dickinson2f947362009-01-07 17:54:07 +0000436 lambd is 1.0 divided by the desired mean. It should be
437 nonzero. (The parameter would be called "lambda", but that is
438 a reserved word in Python.) Returned values range from 0 to
439 positive infinity if lambd is positive, and from negative
440 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000441
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000442 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000443 # lambd: rate lambd = 1/mean
444 # ('lambda' is a Python reserved word)
445
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200446 # we use 1-random() instead of random() to preclude the
447 # possibility of taking the log of zero.
448 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000449
Tim Peterscd804102001-01-25 20:25:57 +0000450## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000451
Tim Petersd7b5e882001-01-25 03:36:26 +0000452 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000453 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000454
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000455 mu is the mean angle, expressed in radians between 0 and 2*pi, and
456 kappa is the concentration parameter, which must be greater than or
457 equal to zero. If kappa is equal to zero, this distribution reduces
458 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000459
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000460 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000461 # mu: mean angle (in radians between 0 and 2*pi)
462 # kappa: concentration parameter kappa (>= 0)
463 # if kappa = 0 generate uniform random angle
464
465 # Based upon an algorithm published in: Fisher, N.I.,
466 # "Statistical Analysis of Circular Data", Cambridge
467 # University Press, 1993.
468
469 # Thanks to Magnus Kessler for a correction to the
470 # implementation of step 4.
471
472 random = self.random
473 if kappa <= 1e-6:
474 return TWOPI * random()
475
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200476 s = 0.5 / kappa
477 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000478
Raymond Hettinger42406e62005-04-30 09:02:51 +0000479 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000480 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000481 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000482
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200483 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000484 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200485 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000486 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000487
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200488 q = 1.0 / r
489 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000490 u3 = random()
491 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000492 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000493 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000494 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000495
496 return theta
497
Tim Peterscd804102001-01-25 20:25:57 +0000498## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000499
500 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000501 """Gamma distribution. Not the gamma function!
502
503 Conditions on the parameters are alpha > 0 and beta > 0.
504
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700505 The probability distribution function is:
506
507 x ** (alpha - 1) * math.exp(-x / beta)
508 pdf(x) = --------------------------------------
509 math.gamma(alpha) * beta ** alpha
510
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000511 """
Tim Peters8ac14952002-05-23 15:15:30 +0000512
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000513 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000514
Guido van Rossum570764d2002-05-14 14:08:12 +0000515 # Warning: a few older sources define the gamma distribution in terms
516 # of alpha > -1.0
517 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000518 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000519
Tim Petersd7b5e882001-01-25 03:36:26 +0000520 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000521 if alpha > 1.0:
522
523 # Uses R.C.H. Cheng, "The generation of Gamma
524 # variables with non-integral shape parameters",
525 # Applied Statistics, (1977), 26, No. 1, p71-74
526
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000527 ainv = _sqrt(2.0 * alpha - 1.0)
528 bbb = alpha - LOG4
529 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000530
Raymond Hettinger42406e62005-04-30 09:02:51 +0000531 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000532 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000533 if not 1e-7 < u1 < .9999999:
534 continue
535 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000536 v = _log(u1/(1.0-u1))/ainv
537 x = alpha*_exp(v)
538 z = u1*u1*u2
539 r = bbb+ccc*v-x
540 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000541 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000542
543 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100544 # expovariate(1/beta)
Tim Petersd7b5e882001-01-25 03:36:26 +0000545 u = random()
546 while u <= 1e-7:
547 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000548 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000549
550 else: # alpha is between 0 and 1 (exclusive)
551
552 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
553
Raymond Hettinger42406e62005-04-30 09:02:51 +0000554 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000555 u = random()
556 b = (_e + alpha)/_e
557 p = b*u
558 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000559 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000560 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000561 x = -_log((b-p)/alpha)
562 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000563 if p > 1.0:
564 if u1 <= x ** (alpha - 1.0):
565 break
566 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000567 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000568 return x * beta
569
Tim Peterscd804102001-01-25 20:25:57 +0000570## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000571
Tim Petersd7b5e882001-01-25 03:36:26 +0000572 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000573 """Gaussian distribution.
574
575 mu is the mean, and sigma is the standard deviation. This is
576 slightly faster than the normalvariate() function.
577
578 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000579
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000580 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000581
Tim Petersd7b5e882001-01-25 03:36:26 +0000582 # When x and y are two variables from [0, 1), uniformly
583 # distributed, then
584 #
585 # cos(2*pi*x)*sqrt(-2*log(1-y))
586 # sin(2*pi*x)*sqrt(-2*log(1-y))
587 #
588 # are two *independent* variables with normal distribution
589 # (mu = 0, sigma = 1).
590 # (Lambert Meertens)
591 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000592
Tim Petersd7b5e882001-01-25 03:36:26 +0000593 # Multithreading note: When two threads call this function
594 # simultaneously, it is possible that they will receive the
595 # same return value. The window is very small though. To
596 # avoid this, you have to use a lock around all calls. (I
597 # didn't want to slow this down in the serial case by using a
598 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000599
Tim Petersd7b5e882001-01-25 03:36:26 +0000600 random = self.random
601 z = self.gauss_next
602 self.gauss_next = None
603 if z is None:
604 x2pi = random() * TWOPI
605 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
606 z = _cos(x2pi) * g2rad
607 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000608
Tim Petersd7b5e882001-01-25 03:36:26 +0000609 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000610
Tim Peterscd804102001-01-25 20:25:57 +0000611## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000612## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300613## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000614## for Ivan Frohne's insightful analysis of why the original implementation:
615##
616## def betavariate(self, alpha, beta):
617## # Discrete Event Simulation in C, pp 87-88.
618##
619## y = self.expovariate(alpha)
620## z = self.expovariate(1.0/beta)
621## return z/(y+z)
622##
623## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000624
Tim Petersd7b5e882001-01-25 03:36:26 +0000625 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000626 """Beta distribution.
627
Thomas Woutersb2137042007-02-01 18:02:27 +0000628 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000629 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000630
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000631 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000632
Tim Peters85e2e472001-01-26 06:49:56 +0000633 # This version due to Janne Sinkkonen, and matches all the std
634 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300635 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000636 if y == 0:
637 return 0.0
638 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300639 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000640
Tim Peterscd804102001-01-25 20:25:57 +0000641## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000642
Tim Petersd7b5e882001-01-25 03:36:26 +0000643 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000644 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000645 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000646
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000647 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000648 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000649
Tim Peterscd804102001-01-25 20:25:57 +0000650## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000651
Tim Petersd7b5e882001-01-25 03:36:26 +0000652 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000653 """Weibull distribution.
654
655 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000656
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000657 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000658 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000659
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000660 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000661 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000662
Raymond Hettinger23f12412004-09-13 22:23:21 +0000663## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000664
Raymond Hettinger23f12412004-09-13 22:23:21 +0000665class SystemRandom(Random):
666 """Alternate random number generator using sources provided
667 by the operating system (such as /dev/urandom on Unix or
668 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000669
670 Not available on all systems (see os.urandom() for details).
671 """
672
673 def random(self):
674 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000675 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000676
677 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300678 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000679 if k <= 0:
680 raise ValueError('number of bits must be greater than zero')
681 if k != int(k):
682 raise TypeError('number of bits should be an integer')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000683 numbytes = (k + 7) // 8 # bits / 8 and rounded up
684 x = int.from_bytes(_urandom(numbytes), 'big')
685 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000686
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000687 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000688 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000689 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000690
691 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000692 "Method should not be called for a system random number generator."
693 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000694 getstate = setstate = _notimplemented
695
Tim Peterscd804102001-01-25 20:25:57 +0000696## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000697
Raymond Hettinger62297132003-08-30 01:24:19 +0000698def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000699 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000700 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000701 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000702 sqsum = 0.0
703 smallest = 1e10
704 largest = -1e10
705 t0 = time.time()
706 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000707 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000708 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000709 sqsum = sqsum + x*x
710 smallest = min(x, smallest)
711 largest = max(x, largest)
712 t1 = time.time()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000713 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000714 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000715 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100716 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000717 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000718
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000719
720def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000721 _test_generator(N, random, ())
722 _test_generator(N, normalvariate, (0.0, 1.0))
723 _test_generator(N, lognormvariate, (0.0, 1.0))
724 _test_generator(N, vonmisesvariate, (0.0, 1.0))
725 _test_generator(N, gammavariate, (0.01, 1.0))
726 _test_generator(N, gammavariate, (0.1, 1.0))
727 _test_generator(N, gammavariate, (0.1, 2.0))
728 _test_generator(N, gammavariate, (0.5, 1.0))
729 _test_generator(N, gammavariate, (0.9, 1.0))
730 _test_generator(N, gammavariate, (1.0, 1.0))
731 _test_generator(N, gammavariate, (2.0, 1.0))
732 _test_generator(N, gammavariate, (20.0, 1.0))
733 _test_generator(N, gammavariate, (200.0, 1.0))
734 _test_generator(N, gauss, (0.0, 1.0))
735 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000736 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000737
Tim Peters715c4c42001-01-26 22:56:56 +0000738# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000739# as module-level functions. The functions share state across all uses
740#(both in the user's code and in the Python libraries), but that's fine
741# for most programs and is easier for the casual user than making them
742# instantiate their own Random() instance.
743
Tim Petersd7b5e882001-01-25 03:36:26 +0000744_inst = Random()
745seed = _inst.seed
746random = _inst.random
747uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000748triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000749randint = _inst.randint
750choice = _inst.choice
751randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000752sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000753shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700754choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000755normalvariate = _inst.normalvariate
756lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000757expovariate = _inst.expovariate
758vonmisesvariate = _inst.vonmisesvariate
759gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000760gauss = _inst.gauss
761betavariate = _inst.betavariate
762paretovariate = _inst.paretovariate
763weibullvariate = _inst.weibullvariate
764getstate = _inst.getstate
765setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000766getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000767
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200768if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700769 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200770
771
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000772if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000773 _test()