blob: e1c2c2bbcbe06682d830d5cea6bad2ddaa10e3c3 [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)):
113 x = ord(a[0]) << 7 if a else 0
114 for c in a:
115 x = ((1000003 * x) ^ ord(c)) & 0xFFFFFFFFFFFFFFFF
116 x ^= len(a)
117 a = -2 if x == -1 else x
118
Raymond Hettinger2f9cc7a2016-08-31 23:00:32 -0700119 if version == 2 and isinstance(a, (str, bytes, bytearray)):
120 if isinstance(a, str):
121 a = a.encode()
122 a += _sha512(a).digest()
123 a = int.from_bytes(a, 'big')
Raymond Hettingerf763a722010-09-07 00:38:15 +0000124
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000125 super().seed(a)
Tim Peters46c04e12002-05-05 20:40:00 +0000126 self.gauss_next = None
127
Tim Peterscd804102001-01-25 20:25:57 +0000128 def getstate(self):
129 """Return internal state; can be passed to setstate() later."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000130 return self.VERSION, super().getstate(), self.gauss_next
Tim Peterscd804102001-01-25 20:25:57 +0000131
132 def setstate(self, state):
133 """Restore internal state from object returned by getstate()."""
134 version = state[0]
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000135 if version == 3:
Raymond Hettinger40f62172002-12-29 23:03:38 +0000136 version, internalstate, self.gauss_next = state
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000137 super().setstate(internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000138 elif version == 2:
139 version, internalstate, self.gauss_next = state
140 # In version 2, the state was saved as signed ints, which causes
141 # inconsistencies between 32/64-bit systems. The state is
142 # really unsigned 32-bit ints, so we convert negative ints from
143 # version 2 to positive longs for version 3.
144 try:
Raymond Hettingerc585eec2010-09-07 15:00:15 +0000145 internalstate = tuple(x % (2**32) for x in internalstate)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000146 except ValueError as e:
147 raise TypeError from e
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000148 super().setstate(internalstate)
Tim Peterscd804102001-01-25 20:25:57 +0000149 else:
150 raise ValueError("state with version %s passed to "
151 "Random.setstate() of version %s" %
152 (version, self.VERSION))
153
Tim Peterscd804102001-01-25 20:25:57 +0000154## ---- Methods below this point do not need to be overridden when
155## ---- subclassing for the purpose of using a different core generator.
156
157## -------------------- pickle support -------------------
158
R David Murrayd9ebf4d2013-04-02 13:10:52 -0400159 # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
160 # longer called; we leave it here because it has been here since random was
161 # rewritten back in 2001 and why risk breaking something.
Tim Peterscd804102001-01-25 20:25:57 +0000162 def __getstate__(self): # for pickle
163 return self.getstate()
164
165 def __setstate__(self, state): # for pickle
166 self.setstate(state)
167
Raymond Hettinger5f078ff2003-06-24 20:29:04 +0000168 def __reduce__(self):
169 return self.__class__, (), self.getstate()
170
Tim Peterscd804102001-01-25 20:25:57 +0000171## -------------------- integer methods -------------------
172
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700173 def randrange(self, start, stop=None, step=1, _int=int):
Tim Petersd7b5e882001-01-25 03:36:26 +0000174 """Choose a random item from range(start, stop[, step]).
175
176 This fixes the problem with randint() which includes the
177 endpoint; in Python this is usually not what you want.
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000178
Tim Petersd7b5e882001-01-25 03:36:26 +0000179 """
180
181 # This code is a bit messy to make it fast for the
Tim Peters9146f272002-08-16 03:41:39 +0000182 # common case while still doing adequate error checking.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700183 istart = _int(start)
Tim Petersd7b5e882001-01-25 03:36:26 +0000184 if istart != start:
Collin Winterce36ad82007-08-30 01:19:48 +0000185 raise ValueError("non-integer arg 1 for randrange()")
Raymond Hettinger3051cc32010-09-07 00:48:40 +0000186 if stop is None:
Tim Petersd7b5e882001-01-25 03:36:26 +0000187 if istart > 0:
Raymond Hettinger05156612010-09-07 04:44:52 +0000188 return self._randbelow(istart)
Collin Winterce36ad82007-08-30 01:19:48 +0000189 raise ValueError("empty range for randrange()")
Tim Peters9146f272002-08-16 03:41:39 +0000190
191 # stop argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700192 istop = _int(stop)
Tim Petersd7b5e882001-01-25 03:36:26 +0000193 if istop != stop:
Collin Winterce36ad82007-08-30 01:19:48 +0000194 raise ValueError("non-integer stop for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000195 width = istop - istart
196 if step == 1 and width > 0:
Raymond Hettingerc3246972010-09-07 09:32:57 +0000197 return istart + self._randbelow(width)
Tim Petersd7b5e882001-01-25 03:36:26 +0000198 if step == 1:
Collin Winterce36ad82007-08-30 01:19:48 +0000199 raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
Tim Peters9146f272002-08-16 03:41:39 +0000200
201 # Non-unit step argument supplied.
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700202 istep = _int(step)
Tim Petersd7b5e882001-01-25 03:36:26 +0000203 if istep != step:
Collin Winterce36ad82007-08-30 01:19:48 +0000204 raise ValueError("non-integer step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000205 if istep > 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000206 n = (width + istep - 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000207 elif istep < 0:
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +0000208 n = (width + istep + 1) // istep
Tim Petersd7b5e882001-01-25 03:36:26 +0000209 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000210 raise ValueError("zero step for randrange()")
Tim Petersd7b5e882001-01-25 03:36:26 +0000211
212 if n <= 0:
Collin Winterce36ad82007-08-30 01:19:48 +0000213 raise ValueError("empty range for randrange()")
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000214
Raymond Hettinger05156612010-09-07 04:44:52 +0000215 return istart + istep*self._randbelow(n)
Tim Petersd7b5e882001-01-25 03:36:26 +0000216
217 def randint(self, a, b):
Tim Peterscd804102001-01-25 20:25:57 +0000218 """Return random integer in range [a, b], including both end points.
Tim Petersd7b5e882001-01-25 03:36:26 +0000219 """
220
221 return self.randrange(a, b+1)
222
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000223 def _randbelow(self, n, int=int, maxsize=1<<BPF, type=type,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000224 Method=_MethodType, BuiltinMethod=_BuiltinMethodType):
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000225 "Return a random int in the range [0,n). Raises ValueError if n==0."
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000226
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700227 random = self.random
Raymond Hettingerc3246972010-09-07 09:32:57 +0000228 getrandbits = self.getrandbits
229 # Only call self.getrandbits if the original random() builtin method
230 # has not been overridden or if a new getrandbits() was supplied.
Raymond Hettingerf77cdbe2013-10-05 17:18:36 -0700231 if type(random) is BuiltinMethod or type(getrandbits) is Method:
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000232 k = n.bit_length() # don't use (n-1) here because n can be 1
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000233 r = getrandbits(k) # 0 <= r < 2**k
Raymond Hettingerc3246972010-09-07 09:32:57 +0000234 while r >= n:
235 r = getrandbits(k)
236 return r
Martin Pantere26da7c2016-06-02 10:07:09 +0000237 # There's an overridden random() method but no new getrandbits() method,
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000238 # so we can only use random() from here.
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000239 if n >= maxsize:
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000240 _warn("Underlying random() generator does not supply \n"
Raymond Hettingerf015b3f2010-09-07 20:04:42 +0000241 "enough bits to choose from a population range this large.\n"
242 "To remove the range limitation, add a getrandbits() method.")
Raymond Hettingere4a3e992010-09-08 00:30:28 +0000243 return int(random() * n)
244 rem = maxsize % n
245 limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
246 r = random()
247 while r >= limit:
248 r = random()
249 return int(r*maxsize) % n
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000250
Tim Peterscd804102001-01-25 20:25:57 +0000251## -------------------- sequence methods -------------------
252
Tim Petersd7b5e882001-01-25 03:36:26 +0000253 def choice(self, seq):
254 """Choose a random element from a non-empty sequence."""
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000255 try:
256 i = self._randbelow(len(seq))
257 except ValueError:
Raymond Hettingerbb2839b2016-12-27 01:06:52 -0800258 raise IndexError('Cannot choose from an empty sequence') from None
Raymond Hettingerdc4872e2010-09-07 10:06:56 +0000259 return seq[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000260
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700261 def shuffle(self, x, random=None):
Antoine Pitrou5e394332012-11-04 02:10:33 +0100262 """Shuffle list x in place, and return None.
Tim Petersd7b5e882001-01-25 03:36:26 +0000263
Antoine Pitrou5e394332012-11-04 02:10:33 +0100264 Optional argument random is a 0-argument function returning a
265 random float in [0.0, 1.0); if it is the default None, the
266 standard random.random will be used.
Senthil Kumaranf8ce51a2013-09-11 22:54:31 -0700267
Tim Petersd7b5e882001-01-25 03:36:26 +0000268 """
269
Raymond Hettinger8fe47c32013-10-05 21:48:21 -0700270 if random is None:
271 randbelow = self._randbelow
272 for i in reversed(range(1, len(x))):
273 # pick an element in x[:i+1] with which to exchange x[i]
274 j = randbelow(i+1)
275 x[i], x[j] = x[j], x[i]
276 else:
277 _int = int
278 for i in reversed(range(1, len(x))):
279 # pick an element in x[:i+1] with which to exchange x[i]
280 j = _int(random() * (i+1))
281 x[i], x[j] = x[j], x[i]
Tim Petersd7b5e882001-01-25 03:36:26 +0000282
Raymond Hettingerfdbe5222003-06-13 07:01:51 +0000283 def sample(self, population, k):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000284 """Chooses k unique random elements from a population sequence or set.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000285
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000286 Returns a new list containing elements from the population while
287 leaving the original population unchanged. The resulting list is
288 in selection order so that all sub-slices will also be valid random
289 samples. This allows raffle winners (the sample) to be partitioned
290 into grand prize and second place winners (the subslices).
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000291
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000292 Members of the population need not be hashable or unique. If the
293 population contains repeats, then each occurrence is a possible
294 selection in the sample.
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000295
Guido van Rossum805365e2007-05-07 22:24:25 +0000296 To choose a sample in a range of integers, use range as an argument.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000297 This is especially fast and space efficient for sampling from a
Guido van Rossum805365e2007-05-07 22:24:25 +0000298 large population: sample(range(10000000), 60)
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000299 """
300
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000301 # Sampling without replacement entails tracking either potential
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000302 # selections (the pool) in a list or previous selections in a set.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000303
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000304 # When the number of selections is small compared to the
305 # population, then tracking selections is efficient, requiring
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000306 # only a small set and an occasional reselection. For
Jeremy Hylton2b55d352004-02-23 17:27:57 +0000307 # a larger number of selections, the pool tracking method is
308 # preferred since the list takes less space than the
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000309 # set and it doesn't suffer from frequent reselections.
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000310
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000311 if isinstance(population, _Set):
Raymond Hettinger1acde192008-01-14 01:00:53 +0000312 population = tuple(population)
Raymond Hettinger57d1a882011-02-23 00:46:28 +0000313 if not isinstance(population, _Sequence):
314 raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000315 randbelow = self._randbelow
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000316 n = len(population)
317 if not 0 <= k <= n:
Raymond Hettingerbf871262016-11-21 14:34:33 -0800318 raise ValueError("Sample larger than population or is negative")
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000319 result = [None] * k
Raymond Hettinger91e27c22005-08-19 01:36:35 +0000320 setsize = 21 # size of a small set minus size of an empty list
321 if k > 5:
Tim Peters9e34c042005-08-26 15:20:46 +0000322 setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
Raymond Hettinger1acde192008-01-14 01:00:53 +0000323 if n <= setsize:
324 # An n-length list is smaller than a k-length set
Raymond Hettinger311f4192002-11-18 09:01:24 +0000325 pool = list(population)
Guido van Rossum805365e2007-05-07 22:24:25 +0000326 for i in range(k): # invariant: non-selected at [0,n-i)
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000327 j = randbelow(n-i)
Raymond Hettinger311f4192002-11-18 09:01:24 +0000328 result[i] = pool[j]
Raymond Hettinger8b9aa8d2003-01-04 05:20:33 +0000329 pool[j] = pool[n-i-1] # move non-selected item into vacancy
Raymond Hettingerc0b40342002-11-13 15:26:37 +0000330 else:
Raymond Hettinger1acde192008-01-14 01:00:53 +0000331 selected = set()
332 selected_add = selected.add
333 for i in range(k):
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000334 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000335 while j in selected:
Raymond Hettinger05a505f2010-09-07 19:19:33 +0000336 j = randbelow(n)
Raymond Hettinger1acde192008-01-14 01:00:53 +0000337 selected_add(j)
338 result[i] = population[j]
Raymond Hettinger311f4192002-11-18 09:01:24 +0000339 return result
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000340
Raymond Hettinger9016f282016-09-26 21:45:57 -0700341 def choices(self, population, weights=None, *, cum_weights=None, k=1):
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700342 """Return a k sized list of population elements chosen with replacement.
343
344 If the relative weights or cumulative weights are not specified,
345 the selections are made with equal probability.
346
347 """
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700348 random = self.random
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700349 if cum_weights is None:
350 if weights is None:
Raymond Hettinger30d00e52016-10-29 16:55:36 -0700351 _int = int
352 total = len(population)
353 return [population[_int(random() * total)] for i in range(k)]
Raymond Hettinger8567e582016-11-01 22:23:11 -0700354 cum_weights = list(_itertools.accumulate(weights))
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700355 elif weights is not None:
Raymond Hettinger24e42392016-11-13 00:42:56 -0500356 raise TypeError('Cannot specify both weights and cumulative weights')
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700357 if len(cum_weights) != len(population):
358 raise ValueError('The number of weights does not match the population')
359 bisect = _bisect.bisect
Raymond Hettingere8f1e002016-09-06 17:15:29 -0700360 total = cum_weights[-1]
361 return [population[bisect(cum_weights, random() * total)] for i in range(k)]
362
Tim Peterscd804102001-01-25 20:25:57 +0000363## -------------------- real-valued distributions -------------------
364
365## -------------------- uniform distribution -------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000366
367 def uniform(self, a, b):
Raymond Hettingerbe40db02009-06-11 23:12:14 +0000368 "Get a random number in the range [a, b) or [a, b] depending on rounding."
Tim Petersd7b5e882001-01-25 03:36:26 +0000369 return a + (b-a) * self.random()
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000370
Christian Heimesfe337bf2008-03-23 21:54:12 +0000371## -------------------- triangular --------------------
372
373 def triangular(self, low=0.0, high=1.0, mode=None):
374 """Triangular distribution.
375
376 Continuous distribution bounded by given lower and upper limits,
377 and having a given mode value in-between.
378
379 http://en.wikipedia.org/wiki/Triangular_distribution
380
381 """
382 u = self.random()
Raymond Hettinger978c6ab2014-05-25 17:25:27 -0700383 try:
384 c = 0.5 if mode is None else (mode - low) / (high - low)
385 except ZeroDivisionError:
386 return low
Christian Heimesfe337bf2008-03-23 21:54:12 +0000387 if u > c:
388 u = 1.0 - u
389 c = 1.0 - c
390 low, high = high, low
391 return low + (high - low) * (u * c) ** 0.5
392
Tim Peterscd804102001-01-25 20:25:57 +0000393## -------------------- normal distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000394
Tim Petersd7b5e882001-01-25 03:36:26 +0000395 def normalvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000396 """Normal distribution.
397
398 mu is the mean, and sigma is the standard deviation.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000399
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000400 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000401 # mu = mean, sigma = standard deviation
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000402
Tim Petersd7b5e882001-01-25 03:36:26 +0000403 # Uses Kinderman and Monahan method. Reference: Kinderman,
404 # A.J. and Monahan, J.F., "Computer generation of random
405 # variables using the ratio of uniform deviates", ACM Trans
406 # Math Software, 3, (1977), pp257-260.
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000407
Tim Petersd7b5e882001-01-25 03:36:26 +0000408 random = self.random
Raymond Hettinger42406e62005-04-30 09:02:51 +0000409 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000410 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000411 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000412 z = NV_MAGICCONST*(u1-0.5)/u2
413 zz = z*z/4.0
414 if zz <= -_log(u2):
415 break
416 return mu + z*sigma
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000417
Tim Peterscd804102001-01-25 20:25:57 +0000418## -------------------- lognormal distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000419
420 def lognormvariate(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000421 """Log normal distribution.
422
423 If you take the natural logarithm of this distribution, you'll get a
424 normal distribution with mean mu and standard deviation sigma.
425 mu can have any value, and sigma must be greater than zero.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000426
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000427 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000428 return _exp(self.normalvariate(mu, sigma))
429
Tim Peterscd804102001-01-25 20:25:57 +0000430## -------------------- exponential distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000431
432 def expovariate(self, lambd):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000433 """Exponential distribution.
434
Mark Dickinson2f947362009-01-07 17:54:07 +0000435 lambd is 1.0 divided by the desired mean. It should be
436 nonzero. (The parameter would be called "lambda", but that is
437 a reserved word in Python.) Returned values range from 0 to
438 positive infinity if lambd is positive, and from negative
439 infinity to 0 if lambd is negative.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000440
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000441 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000442 # lambd: rate lambd = 1/mean
443 # ('lambda' is a Python reserved word)
444
Raymond Hettinger5279fb92011-06-25 11:30:53 +0200445 # we use 1-random() instead of random() to preclude the
446 # possibility of taking the log of zero.
447 return -_log(1.0 - self.random())/lambd
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000448
Tim Peterscd804102001-01-25 20:25:57 +0000449## -------------------- von Mises distribution --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000450
Tim Petersd7b5e882001-01-25 03:36:26 +0000451 def vonmisesvariate(self, mu, kappa):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000452 """Circular data distribution.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000453
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000454 mu is the mean angle, expressed in radians between 0 and 2*pi, and
455 kappa is the concentration parameter, which must be greater than or
456 equal to zero. If kappa is equal to zero, this distribution reduces
457 to a uniform random angle over the range 0 to 2*pi.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000458
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000459 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000460 # mu: mean angle (in radians between 0 and 2*pi)
461 # kappa: concentration parameter kappa (>= 0)
462 # if kappa = 0 generate uniform random angle
463
464 # Based upon an algorithm published in: Fisher, N.I.,
465 # "Statistical Analysis of Circular Data", Cambridge
466 # University Press, 1993.
467
468 # Thanks to Magnus Kessler for a correction to the
469 # implementation of step 4.
470
471 random = self.random
472 if kappa <= 1e-6:
473 return TWOPI * random()
474
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200475 s = 0.5 / kappa
476 r = s + _sqrt(1.0 + s * s)
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000477
Raymond Hettinger42406e62005-04-30 09:02:51 +0000478 while 1:
Tim Peters0c9886d2001-01-15 01:18:21 +0000479 u1 = random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000480 z = _cos(_pi * u1)
Tim Petersd7b5e882001-01-25 03:36:26 +0000481
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200482 d = z / (r + z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000483 u2 = random()
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200484 if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
Tim Peters0c9886d2001-01-15 01:18:21 +0000485 break
Tim Petersd7b5e882001-01-25 03:36:26 +0000486
Serhiy Storchaka6c22b1d2013-02-10 19:28:56 +0200487 q = 1.0 / r
488 f = (q + z) / (1.0 + q * z)
Tim Petersd7b5e882001-01-25 03:36:26 +0000489 u3 = random()
490 if u3 > 0.5:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000491 theta = (mu + _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000492 else:
Mark Dickinsonbe5f9192013-02-10 14:16:10 +0000493 theta = (mu - _acos(f)) % TWOPI
Tim Petersd7b5e882001-01-25 03:36:26 +0000494
495 return theta
496
Tim Peterscd804102001-01-25 20:25:57 +0000497## -------------------- gamma distribution --------------------
Tim Petersd7b5e882001-01-25 03:36:26 +0000498
499 def gammavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000500 """Gamma distribution. Not the gamma function!
501
502 Conditions on the parameters are alpha > 0 and beta > 0.
503
Raymond Hettingera8e4d6e2011-03-22 15:55:51 -0700504 The probability distribution function is:
505
506 x ** (alpha - 1) * math.exp(-x / beta)
507 pdf(x) = --------------------------------------
508 math.gamma(alpha) * beta ** alpha
509
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000510 """
Tim Peters8ac14952002-05-23 15:15:30 +0000511
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000512 # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
Tim Peters8ac14952002-05-23 15:15:30 +0000513
Guido van Rossum570764d2002-05-14 14:08:12 +0000514 # Warning: a few older sources define the gamma distribution in terms
515 # of alpha > -1.0
516 if alpha <= 0.0 or beta <= 0.0:
Collin Winterce36ad82007-08-30 01:19:48 +0000517 raise ValueError('gammavariate: alpha and beta must be > 0.0')
Tim Peters8ac14952002-05-23 15:15:30 +0000518
Tim Petersd7b5e882001-01-25 03:36:26 +0000519 random = self.random
Tim Petersd7b5e882001-01-25 03:36:26 +0000520 if alpha > 1.0:
521
522 # Uses R.C.H. Cheng, "The generation of Gamma
523 # variables with non-integral shape parameters",
524 # Applied Statistics, (1977), 26, No. 1, p71-74
525
Raymond Hettingerca6cdc22002-05-13 23:40:14 +0000526 ainv = _sqrt(2.0 * alpha - 1.0)
527 bbb = alpha - LOG4
528 ccc = alpha + ainv
Tim Peters8ac14952002-05-23 15:15:30 +0000529
Raymond Hettinger42406e62005-04-30 09:02:51 +0000530 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000531 u1 = random()
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000532 if not 1e-7 < u1 < .9999999:
533 continue
534 u2 = 1.0 - random()
Tim Petersd7b5e882001-01-25 03:36:26 +0000535 v = _log(u1/(1.0-u1))/ainv
536 x = alpha*_exp(v)
537 z = u1*u1*u2
538 r = bbb+ccc*v-x
539 if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000540 return x * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000541
542 elif alpha == 1.0:
leodema9f396b62017-06-04 07:41:41 +0100543 # expovariate(1/beta)
Tim Petersd7b5e882001-01-25 03:36:26 +0000544 u = random()
545 while u <= 1e-7:
546 u = random()
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000547 return -_log(u) * beta
Tim Petersd7b5e882001-01-25 03:36:26 +0000548
549 else: # alpha is between 0 and 1 (exclusive)
550
551 # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
552
Raymond Hettinger42406e62005-04-30 09:02:51 +0000553 while 1:
Tim Petersd7b5e882001-01-25 03:36:26 +0000554 u = random()
555 b = (_e + alpha)/_e
556 p = b*u
557 if p <= 1.0:
Raymond Hettinger42406e62005-04-30 09:02:51 +0000558 x = p ** (1.0/alpha)
Tim Petersd7b5e882001-01-25 03:36:26 +0000559 else:
Tim Petersd7b5e882001-01-25 03:36:26 +0000560 x = -_log((b-p)/alpha)
561 u1 = random()
Raymond Hettinger42406e62005-04-30 09:02:51 +0000562 if p > 1.0:
563 if u1 <= x ** (alpha - 1.0):
564 break
565 elif u1 <= _exp(-x):
Tim Petersd7b5e882001-01-25 03:36:26 +0000566 break
Raymond Hettingerb760efb2002-05-14 06:40:34 +0000567 return x * beta
568
Tim Peterscd804102001-01-25 20:25:57 +0000569## -------------------- Gauss (faster alternative) --------------------
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000570
Tim Petersd7b5e882001-01-25 03:36:26 +0000571 def gauss(self, mu, sigma):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000572 """Gaussian distribution.
573
574 mu is the mean, and sigma is the standard deviation. This is
575 slightly faster than the normalvariate() function.
576
577 Not thread-safe without a lock around calls.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000578
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000579 """
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000580
Tim Petersd7b5e882001-01-25 03:36:26 +0000581 # When x and y are two variables from [0, 1), uniformly
582 # distributed, then
583 #
584 # cos(2*pi*x)*sqrt(-2*log(1-y))
585 # sin(2*pi*x)*sqrt(-2*log(1-y))
586 #
587 # are two *independent* variables with normal distribution
588 # (mu = 0, sigma = 1).
589 # (Lambert Meertens)
590 # (corrected version; bug discovered by Mike Miller, fixed by LM)
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000591
Tim Petersd7b5e882001-01-25 03:36:26 +0000592 # Multithreading note: When two threads call this function
593 # simultaneously, it is possible that they will receive the
594 # same return value. The window is very small though. To
595 # avoid this, you have to use a lock around all calls. (I
596 # didn't want to slow this down in the serial case by using a
597 # lock here.)
Guido van Rossumd03e1191998-05-29 17:51:31 +0000598
Tim Petersd7b5e882001-01-25 03:36:26 +0000599 random = self.random
600 z = self.gauss_next
601 self.gauss_next = None
602 if z is None:
603 x2pi = random() * TWOPI
604 g2rad = _sqrt(-2.0 * _log(1.0 - random()))
605 z = _cos(x2pi) * g2rad
606 self.gauss_next = _sin(x2pi) * g2rad
Guido van Rossumcc32ac91994-03-15 16:10:24 +0000607
Tim Petersd7b5e882001-01-25 03:36:26 +0000608 return mu + z*sigma
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000609
Tim Peterscd804102001-01-25 20:25:57 +0000610## -------------------- beta --------------------
Tim Peters85e2e472001-01-26 06:49:56 +0000611## See
Ezio Melotti20f53f12011-04-15 08:25:16 +0300612## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
Tim Peters85e2e472001-01-26 06:49:56 +0000613## for Ivan Frohne's insightful analysis of why the original implementation:
614##
615## def betavariate(self, alpha, beta):
616## # Discrete Event Simulation in C, pp 87-88.
617##
618## y = self.expovariate(alpha)
619## z = self.expovariate(1.0/beta)
620## return z/(y+z)
621##
622## was dead wrong, and how it probably got that way.
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000623
Tim Petersd7b5e882001-01-25 03:36:26 +0000624 def betavariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000625 """Beta distribution.
626
Thomas Woutersb2137042007-02-01 18:02:27 +0000627 Conditions on the parameters are alpha > 0 and beta > 0.
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000628 Returned values range between 0 and 1.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000629
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000630 """
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000631
Tim Peters85e2e472001-01-26 06:49:56 +0000632 # This version due to Janne Sinkkonen, and matches all the std
633 # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300634 y = self.gammavariate(alpha, 1.0)
Tim Peters85e2e472001-01-26 06:49:56 +0000635 if y == 0:
636 return 0.0
637 else:
Raymond Hettinger650c1c92016-06-25 05:36:42 +0300638 return y / (y + self.gammavariate(beta, 1.0))
Guido van Rossum95bfcda1994-03-09 14:21:05 +0000639
Tim Peterscd804102001-01-25 20:25:57 +0000640## -------------------- Pareto --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000641
Tim Petersd7b5e882001-01-25 03:36:26 +0000642 def paretovariate(self, alpha):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000643 """Pareto distribution. alpha is the shape parameter."""
Tim Petersd7b5e882001-01-25 03:36:26 +0000644 # Jain, pg. 495
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000645
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000646 u = 1.0 - self.random()
Raymond Hettinger8ff10992010-09-08 18:58:33 +0000647 return 1.0 / u ** (1.0/alpha)
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000648
Tim Peterscd804102001-01-25 20:25:57 +0000649## -------------------- Weibull --------------------
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000650
Tim Petersd7b5e882001-01-25 03:36:26 +0000651 def weibullvariate(self, alpha, beta):
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000652 """Weibull distribution.
653
654 alpha is the scale parameter and beta is the shape parameter.
Raymond Hettingeref4d4bd2002-05-23 23:58:17 +0000655
Raymond Hettingerc32f0332002-05-23 19:44:49 +0000656 """
Tim Petersd7b5e882001-01-25 03:36:26 +0000657 # Jain, pg. 499; bug fix courtesy Bill Arms
Guido van Rossumcf4559a1997-12-02 02:47:39 +0000658
Raymond Hettinger73ced7e2003-01-04 09:26:32 +0000659 u = 1.0 - self.random()
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000660 return alpha * (-_log(u)) ** (1.0/beta)
Guido van Rossum6c395ba1999-08-18 13:53:28 +0000661
Raymond Hettinger23f12412004-09-13 22:23:21 +0000662## --------------- Operating System Random Source ------------------
Raymond Hettinger356a4592004-08-30 06:14:31 +0000663
Raymond Hettinger23f12412004-09-13 22:23:21 +0000664class SystemRandom(Random):
665 """Alternate random number generator using sources provided
666 by the operating system (such as /dev/urandom on Unix or
667 CryptGenRandom on Windows).
Raymond Hettinger356a4592004-08-30 06:14:31 +0000668
669 Not available on all systems (see os.urandom() for details).
670 """
671
672 def random(self):
673 """Get the next random number in the range [0.0, 1.0)."""
Raymond Hettinger183cd1f2010-09-08 18:48:21 +0000674 return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
Raymond Hettinger356a4592004-08-30 06:14:31 +0000675
676 def getrandbits(self, k):
Serhiy Storchaka95949422013-08-27 19:40:23 +0300677 """getrandbits(k) -> x. Generates an int with k random bits."""
Raymond Hettinger356a4592004-08-30 06:14:31 +0000678 if k <= 0:
679 raise ValueError('number of bits must be greater than zero')
680 if k != int(k):
681 raise TypeError('number of bits should be an integer')
Raymond Hettinger63b17672010-09-08 19:27:59 +0000682 numbytes = (k + 7) // 8 # bits / 8 and rounded up
683 x = int.from_bytes(_urandom(numbytes), 'big')
684 return x >> (numbytes * 8 - k) # trim excess bits
Raymond Hettinger356a4592004-08-30 06:14:31 +0000685
Raymond Hettinger28de64f2008-01-13 23:40:30 +0000686 def seed(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000687 "Stub method. Not used for a system random number generator."
Raymond Hettinger356a4592004-08-30 06:14:31 +0000688 return None
Raymond Hettinger356a4592004-08-30 06:14:31 +0000689
690 def _notimplemented(self, *args, **kwds):
Raymond Hettinger23f12412004-09-13 22:23:21 +0000691 "Method should not be called for a system random number generator."
692 raise NotImplementedError('System entropy source does not have state.')
Raymond Hettinger356a4592004-08-30 06:14:31 +0000693 getstate = setstate = _notimplemented
694
Tim Peterscd804102001-01-25 20:25:57 +0000695## -------------------- test program --------------------
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000696
Raymond Hettinger62297132003-08-30 01:24:19 +0000697def _test_generator(n, func, args):
Tim Peters0c9886d2001-01-15 01:18:21 +0000698 import time
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000699 print(n, 'times', func.__name__)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000700 total = 0.0
Tim Peters0c9886d2001-01-15 01:18:21 +0000701 sqsum = 0.0
702 smallest = 1e10
703 largest = -1e10
704 t0 = time.time()
705 for i in range(n):
Raymond Hettinger62297132003-08-30 01:24:19 +0000706 x = func(*args)
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000707 total += x
Tim Peters0c9886d2001-01-15 01:18:21 +0000708 sqsum = sqsum + x*x
709 smallest = min(x, smallest)
710 largest = max(x, largest)
711 t1 = time.time()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000712 print(round(t1-t0, 3), 'sec,', end=' ')
Raymond Hettingerb98154e2003-05-24 17:26:02 +0000713 avg = total/n
Tim Petersd7b5e882001-01-25 03:36:26 +0000714 stddev = _sqrt(sqsum/n - avg*avg)
Raymond Hettinger1f548142014-05-19 20:21:43 +0100715 print('avg %g, stddev %g, min %g, max %g\n' % \
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000716 (avg, stddev, smallest, largest))
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000717
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000718
719def _test(N=2000):
Raymond Hettinger62297132003-08-30 01:24:19 +0000720 _test_generator(N, random, ())
721 _test_generator(N, normalvariate, (0.0, 1.0))
722 _test_generator(N, lognormvariate, (0.0, 1.0))
723 _test_generator(N, vonmisesvariate, (0.0, 1.0))
724 _test_generator(N, gammavariate, (0.01, 1.0))
725 _test_generator(N, gammavariate, (0.1, 1.0))
726 _test_generator(N, gammavariate, (0.1, 2.0))
727 _test_generator(N, gammavariate, (0.5, 1.0))
728 _test_generator(N, gammavariate, (0.9, 1.0))
729 _test_generator(N, gammavariate, (1.0, 1.0))
730 _test_generator(N, gammavariate, (2.0, 1.0))
731 _test_generator(N, gammavariate, (20.0, 1.0))
732 _test_generator(N, gammavariate, (200.0, 1.0))
733 _test_generator(N, gauss, (0.0, 1.0))
734 _test_generator(N, betavariate, (3.0, 3.0))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000735 _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
Tim Peterscd804102001-01-25 20:25:57 +0000736
Tim Peters715c4c42001-01-26 22:56:56 +0000737# Create one instance, seeded from current time, and export its methods
Raymond Hettinger40f62172002-12-29 23:03:38 +0000738# as module-level functions. The functions share state across all uses
739#(both in the user's code and in the Python libraries), but that's fine
740# for most programs and is easier for the casual user than making them
741# instantiate their own Random() instance.
742
Tim Petersd7b5e882001-01-25 03:36:26 +0000743_inst = Random()
744seed = _inst.seed
745random = _inst.random
746uniform = _inst.uniform
Christian Heimesfe337bf2008-03-23 21:54:12 +0000747triangular = _inst.triangular
Tim Petersd7b5e882001-01-25 03:36:26 +0000748randint = _inst.randint
749choice = _inst.choice
750randrange = _inst.randrange
Raymond Hettingerf24eb352002-11-12 17:41:57 +0000751sample = _inst.sample
Tim Petersd7b5e882001-01-25 03:36:26 +0000752shuffle = _inst.shuffle
Raymond Hettinger28aa4a02016-09-07 00:08:44 -0700753choices = _inst.choices
Tim Petersd7b5e882001-01-25 03:36:26 +0000754normalvariate = _inst.normalvariate
755lognormvariate = _inst.lognormvariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000756expovariate = _inst.expovariate
757vonmisesvariate = _inst.vonmisesvariate
758gammavariate = _inst.gammavariate
Tim Petersd7b5e882001-01-25 03:36:26 +0000759gauss = _inst.gauss
760betavariate = _inst.betavariate
761paretovariate = _inst.paretovariate
762weibullvariate = _inst.weibullvariate
763getstate = _inst.getstate
764setstate = _inst.setstate
Raymond Hettinger2f726e92003-10-05 09:09:15 +0000765getrandbits = _inst.getrandbits
Tim Petersd7b5e882001-01-25 03:36:26 +0000766
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200767if hasattr(_os, "fork"):
Gregory P. Smith163468a2017-05-29 10:03:41 -0700768 _os.register_at_fork(after_in_child=_inst.seed)
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200769
770
Guido van Rossumff03b1a1994-03-09 12:55:02 +0000771if __name__ == '__main__':
Tim Petersd7b5e882001-01-25 03:36:26 +0000772 _test()