random.py revision 9aaeb5e0c8b5946b305590eb85312c282a457098
1e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum"""Random variable generators. 2e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum 3d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters integers 4d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters -------- 5d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters uniform within range 6d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 7d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters sequences 8d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters --------- 9d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters pick random element 10f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger pick random sample 11d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters generate random permutation 12d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 13e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum distributions on the real line: 14e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum ------------------------------ 15d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters uniform 16bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger triangular 17e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum normal (Gaussian) 18e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum lognormal 19e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum negative exponential 20e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum gamma 21e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum beta 2240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger pareto 2340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger Weibull 24e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum 25e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum distributions on the circle (angles 0 to 2pi) 26e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum --------------------------------------------- 27e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum circular uniform 28e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum von Mises 29e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum 3040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond HettingerGeneral notes on the underlying Mersenne Twister core generator: 3140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 3240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger* The period is 2**19937-1. 330e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters* It is one of the most extensively tested generators in existence. 340e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters* Without a direct way to compute N steps forward, the semantics of 350e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters jumpahead(n) are weakened to simply jump to another distant state and rely 360e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters on the large period to avoid overlapping sequences. 370e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters* The random() method is implemented in C, executes in a single Python step, 380e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters and is, therefore, threadsafe. 3940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 40e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum""" 41d03e1197cb5052e3f758794e2a7aecf9f5ca5f46Guido van Rossum 42c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettingerfrom __future__ import division 432f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingerfrom warnings import warn as _warn 442f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingerfrom types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType 4591e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettingerfrom math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil 46d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersfrom math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin 47c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettingerfrom os import urandom as _urandom 48c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettingerfrom binascii import hexlify as _hexlify 49ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettingerimport hashlib as _hashlib 50d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 51f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger__all__ = ["Random","seed","random","uniform","randint","choice","sample", 520de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro "randrange","shuffle","normalvariate","lognormvariate", 53bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger "expovariate","vonmisesvariate","gammavariate","triangular", 54f8a52d38ad784b34a60720cb148180d6eb6de373Raymond Hettinger "gauss","betavariate","paretovariate","weibullvariate", 55356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger "getstate","setstate","jumpahead", "WichmannHill", "getrandbits", 5623f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger "SystemRandom"] 57ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 58d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersNV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) 59d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersTWOPI = 2.0*_pi 60d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersLOG4 = _log(4.0) 61d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersSG_MAGICCONST = 1.0 + _log(4.5) 622f726e9093381572b21edbfc42659ea89fbdf686Raymond HettingerBPF = 53 # Number of bits in a float 637c2a85b2d44851c2442ade579b760f86447bf848Tim PetersRECIP_BPF = 2**-BPF 6433d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum 65356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 66d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters# Translated by Guido van Rossum from C source provided by 6740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# Adrian Baddeley. Adapted by Raymond Hettinger for use with 683fa19d7ff89be87139e2864fb9186b424d180a58Raymond Hettinger# the Mersenne Twister and os.urandom() core generators. 6933d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum 70145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettingerimport _random 7140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 72145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettingerclass Random(_random.Random): 73c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Random number generator base class used by bound module functions. 74c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 75c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger Used to instantiate instances of Random to get generators that don't 76c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger share state. Especially useful for multi-threaded programs, creating 77c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger a different instance of Random for each thread, and using the jumpahead() 78c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger method to ensure that the generated sequences seen by each thread don't 79c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger overlap. 80c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 81c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger Class Random can also be subclassed if you want to use a different basic 82c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger generator of your own devising: in that case, override the following 83f2eb2b44fc532c77c03bc95789817a20d7c558c3Benjamin Peterson methods: random(), seed(), getstate(), setstate() and jumpahead(). 84f2eb2b44fc532c77c03bc95789817a20d7c558c3Benjamin Peterson Optionally, implement a getrandbits() method so that randrange() can cover 85f2eb2b44fc532c77c03bc95789817a20d7c558c3Benjamin Peterson arbitrarily large ranges. 86ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 87c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 8833d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum 896b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis VERSION = 3 # used by getstate/setstate 9033d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum 91d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def __init__(self, x=None): 92d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """Initialize an instance. 9333d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum 94d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters Optional argument x controls seeding, as for Random.seed(). 95d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """ 9633d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum 97d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters self.seed(x) 9840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self.gauss_next = None 99ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 1000de88fc4b108751b86443852b6741680d704168fTim Peters def seed(self, a=None): 1010de88fc4b108751b86443852b6741680d704168fTim Peters """Initialize internal state from hashable object. 102d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 10323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger None or no argument seeds from current time or from an operating 10423f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger system specific randomness source if available. 1050de88fc4b108751b86443852b6741680d704168fTim Peters 106bcd725fc456faca13f4598f87c0517f917711cdaTim Peters If a is not None or an int or long, hash(a) is used instead. 107d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """ 108d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 1093081d59f920229b26293c7a3ee3f1a9da0da53e9Raymond Hettinger if a is None: 110c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger try: 111c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger a = long(_hexlify(_urandom(16)), 16) 112c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger except NotImplementedError: 113356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger import time 114356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger a = long(time.time() * 256) # use fractional seconds 115356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 116145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger super(Random, self).seed(a) 11746c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters self.gauss_next = None 11846c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters 119d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def getstate(self): 120d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """Return internal state; can be passed to setstate() later.""" 121145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger return self.VERSION, super(Random, self).getstate(), self.gauss_next 122d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 123d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def setstate(self, state): 124d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """Restore internal state from object returned by getstate().""" 125d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters version = state[0] 1266b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis if version == 3: 12740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger version, internalstate, self.gauss_next = state 128145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger super(Random, self).setstate(internalstate) 1296b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis elif version == 2: 1306b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis version, internalstate, self.gauss_next = state 1316b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis # In version 2, the state was saved as signed ints, which causes 1326b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis # inconsistencies between 32/64-bit systems. The state is 1336b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis # really unsigned 32-bit ints, so we convert negative ints from 1346b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis # version 2 to positive longs for version 3. 1356b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis try: 1366b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis internalstate = tuple( long(x) % (2**32) for x in internalstate ) 1376b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis except ValueError, e: 1386b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis raise TypeError, e 1396b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis super(Random, self).setstate(internalstate) 140d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters else: 141d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError("state with version %s passed to " 142d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters "Random.setstate() of version %s" % 143d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters (version, self.VERSION)) 144d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 145ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger def jumpahead(self, n): 146ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger """Change the internal state to one that is likely far away 147ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger from the current state. This method will not be in Py3.x, 148ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger so it is better to simply reseed. 149ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger """ 150ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger # The super.jumpahead() method uses shuffling to change state, 151ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger # so it needs a large and "interesting" n to work with. Here, 152ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger # we use hashing to create a large n for the shuffle. 153ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger s = repr(n) + repr(self.getstate()) 154ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger n = int(_hashlib.new('sha512', s).hexdigest(), 16) 155ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger super(Random, self).jumpahead(n) 156ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger 157cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- Methods below this point do not need to be overridden when 158cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- subclassing for the purpose of using a different core generator. 159d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 160cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- pickle support ------------------- 161d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 162cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters def __getstate__(self): # for pickle 163cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters return self.getstate() 164d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 165cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters def __setstate__(self, state): # for pickle 166cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters self.setstate(state) 167cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters 1685f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger def __reduce__(self): 1695f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger return self.__class__, (), self.getstate() 1705f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger 171cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- integer methods ------------------- 172d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 1732f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger def randrange(self, start, stop=None, step=1, int=int, default=None, 1742f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger maxwidth=1L<<BPF): 175d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """Choose a random item from range(start, stop[, step]). 176d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 177d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters This fixes the problem with randint() which includes the 178d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters endpoint; in Python this is usually not what you want. 1792f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger Do not supply the 'int', 'default', and 'maxwidth' arguments. 180d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """ 181d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 182d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # This code is a bit messy to make it fast for the 1839146f27b7799dab231083f194a14c6157b57549fTim Peters # common case while still doing adequate error checking. 184d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters istart = int(start) 185d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if istart != start: 186d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError, "non-integer arg 1 for randrange()" 187d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if stop is default: 188d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if istart > 0: 1892f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger if istart >= maxwidth: 1902f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger return self._randbelow(istart) 191d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return int(self.random() * istart) 192d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError, "empty range for randrange()" 1939146f27b7799dab231083f194a14c6157b57549fTim Peters 1949146f27b7799dab231083f194a14c6157b57549fTim Peters # stop argument supplied. 195d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters istop = int(stop) 196d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if istop != stop: 197d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError, "non-integer stop for randrange()" 1982f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger width = istop - istart 1992f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger if step == 1 and width > 0: 20076ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # Note that 2012f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger # int(istart + self.random()*width) 20276ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # instead would be incorrect. For example, consider istart 20376ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # = -2 and istop = 0. Then the guts would be in 20476ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # -2.0 to 0.0 exclusive on both ends (ignoring that random() 20576ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # might return 0.0), and because int() truncates toward 0, the 20676ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # final result would be -1 or 0 (instead of -2 or -1). 2072f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger # istart + int(self.random()*width) 20876ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # would also be incorrect, for a subtler reason: the RHS 20976ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # can return a long, and then randrange() would also return 21076ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # a long, but we're supposed to return an int (for backward 21176ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters # compatibility). 2122f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger 2132f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger if width >= maxwidth: 21458eb11cf62dd04ccc2c364b62fd51b4265e2e203Tim Peters return int(istart + self._randbelow(width)) 2152f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger return int(istart + int(self.random()*width)) 216d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if step == 1: 2172f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width) 2189146f27b7799dab231083f194a14c6157b57549fTim Peters 2199146f27b7799dab231083f194a14c6157b57549fTim Peters # Non-unit step argument supplied. 220d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters istep = int(step) 221d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if istep != step: 222d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError, "non-integer step for randrange()" 223d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if istep > 0: 224ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger n = (width + istep - 1) // istep 225d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters elif istep < 0: 226ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger n = (width + istep + 1) // istep 227d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters else: 228d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError, "zero step for randrange()" 229d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 230d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if n <= 0: 231d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters raise ValueError, "empty range for randrange()" 2322f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger 2332f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger if n >= maxwidth: 23494547f7646895e032f8fc145529d9efc3a70760dRaymond Hettinger return istart + istep*self._randbelow(n) 235d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return istart + istep*int(self.random() * n) 236d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 237d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def randint(self, a, b): 238cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters """Return random integer in range [a, b], including both end points. 239d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """ 240d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 241d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return self.randrange(a, b+1) 242d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 2432f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger def _randbelow(self, n, _log=_log, int=int, _maxwidth=1L<<BPF, 2442f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger _Method=_MethodType, _BuiltinMethod=_BuiltinMethodType): 2452f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger """Return a random int in the range [0,n) 2462f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger 2472f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger Handles the case where n has more bits than returned 2482f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger by a single call to the underlying generator. 2492f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger """ 2502f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger 2512f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger try: 2522f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger getrandbits = self.getrandbits 2532f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger except AttributeError: 2542f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger pass 2552f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger else: 2562f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger # Only call self.getrandbits if the original random() builtin method 2572f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger # has not been overridden or if a new getrandbits() was supplied. 2582f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger # This assures that the two methods correspond. 2592f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger if type(self.random) is _BuiltinMethod or type(getrandbits) is _Method: 2602f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger k = int(1.00001 + _log(n-1, 2.0)) # 2**k > n-1 > 2**(k-2) 2612f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger r = getrandbits(k) 2622f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger while r >= n: 2632f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger r = getrandbits(k) 2642f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger return r 2652f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger if n >= _maxwidth: 2662f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger _warn("Underlying random() generator does not supply \n" 2672f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger "enough bits to choose from a population range this large") 2682f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger return int(self.random() * n) 2692f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger 270cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- sequence methods ------------------- 271cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters 272d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def choice(self, seq): 273d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """Choose a random element from a non-empty sequence.""" 2745dae505bbd59641a948c81bea981e7c44d4c2343Raymond Hettinger return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty 275d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 276d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def shuffle(self, x, random=None, int=int): 277d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """x, random=random.random -> shuffle list x in place; return None. 278d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 279d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters Optional arg random is a 0-argument function returning a random 280d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters float in [0.0, 1.0); by default, the standard random.random. 281d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters """ 282d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 283d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if random is None: 284d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters random = self.random 28585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger for i in reversed(xrange(1, len(x))): 286cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters # pick an element in x[:i+1] with which to exchange x[i] 287d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters j = int(random() * (i+1)) 288d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters x[i], x[j] = x[j], x[i] 289d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 290fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger def sample(self, population, k): 291f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger """Chooses k unique random elements from a population sequence. 292f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger 293c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger Returns a new list containing elements from the population while 294c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger leaving the original population unchanged. The resulting list is 295c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger in selection order so that all sub-slices will also be valid random 296c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger samples. This allows raffle winners (the sample) to be partitioned 297c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger into grand prize and second place winners (the subslices). 298f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger 299c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger Members of the population need not be hashable or unique. If the 300c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger population contains repeats, then each occurrence is a possible 301c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger selection in the sample. 302f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger 303c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger To choose a sample in a range of integers, use xrange as an argument. 304c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger This is especially fast and space efficient for sampling from a 305c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger large population: sample(xrange(10000000), 60) 306f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger """ 307f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger 308c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger # Sampling without replacement entails tracking either potential 30991e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger # selections (the pool) in a list or previous selections in a set. 310c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger 3112b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton # When the number of selections is small compared to the 3122b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton # population, then tracking selections is efficient, requiring 31391e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger # only a small set and an occasional reselection. For 3142b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton # a larger number of selections, the pool tracking method is 3152b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton # preferred since the list takes less space than the 31691e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger # set and it doesn't suffer from frequent reselections. 317c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger 318f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger n = len(population) 319f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger if not 0 <= k <= n: 32022d8f7b9b80cf4f89ad2c383e566f8fd1c6d5e52Raymond Hettinger raise ValueError("sample larger than population") 3218b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger random = self.random 322fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger _int = int 323c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger result = [None] * k 32491e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger setsize = 21 # size of a small set minus size of an empty list 32591e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger if k > 5: 3269e34c047325651853a95f95e538582a4f6d5b7f6Tim Peters setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets 327c17976e9833f3093adb1019356737e728a24f7c9Tim Peters if n <= setsize or hasattr(population, "keys"): 328c17976e9833f3093adb1019356737e728a24f7c9Tim Peters # An n-length list is smaller than a k-length set, or this is a 329c17976e9833f3093adb1019356737e728a24f7c9Tim Peters # mapping type so the other algorithm wouldn't work. 330311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger pool = list(population) 331311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger for i in xrange(k): # invariant: non-selected at [0,n-i) 332fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger j = _int(random() * (n-i)) 333311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger result[i] = pool[j] 3348b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger pool[j] = pool[n-i-1] # move non-selected item into vacancy 335c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger else: 33666d09f1b3029d9cf975ccf26c437c9fb2605db91Raymond Hettinger try: 3373c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger selected = set() 3383c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger selected_add = selected.add 3393c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger for i in xrange(k): 340fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger j = _int(random() * n) 3413c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger while j in selected: 3423c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger j = _int(random() * n) 3433c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger selected_add(j) 3443c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger result[i] = population[j] 345c17976e9833f3093adb1019356737e728a24f7c9Tim Peters except (TypeError, KeyError): # handle (at least) sets 3463c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger if isinstance(population, list): 3473c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger raise 348c17976e9833f3093adb1019356737e728a24f7c9Tim Peters return self.sample(tuple(population), k) 349311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger return result 350f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger 351cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- real-valued distributions ------------------- 352cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters 353cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- uniform distribution ------------------- 354d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 355d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def uniform(self, a, b): 3562c0cdca56447d33e714a010459ee4318fff89c66Raymond Hettinger "Get a random number in the range [a, b) or [a, b] depending on rounding." 357d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return a + (b-a) * self.random() 358ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 359bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger## -------------------- triangular -------------------- 360bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger 361c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger def triangular(self, low=0.0, high=1.0, mode=None): 362bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger """Triangular distribution. 363bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger 364bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger Continuous distribution bounded by given lower and upper limits, 365bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger and having a given mode value in-between. 366bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger 367bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger http://en.wikipedia.org/wiki/Triangular_distribution 368bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger 369bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger """ 370bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger u = self.random() 371c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger c = 0.5 if mode is None else (mode - low) / (high - low) 372bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger if u > c: 373c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger u = 1.0 - u 374c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger c = 1.0 - c 375bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger low, high = high, low 376bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger return low + (high - low) * (u * c) ** 0.5 377bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger 378cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- normal distribution -------------------- 379ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 380d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def normalvariate(self, mu, sigma): 381c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Normal distribution. 382c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 383c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger mu is the mean, and sigma is the standard deviation. 384ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 385c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 386d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # mu = mean, sigma = standard deviation 387d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 388d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Uses Kinderman and Monahan method. Reference: Kinderman, 389d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # A.J. and Monahan, J.F., "Computer generation of random 390d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # variables using the ratio of uniform deviates", ACM Trans 391d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Math Software, 3, (1977), pp257-260. 392d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 393d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters random = self.random 39442406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger while 1: 395d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u1 = random() 39673ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger u2 = 1.0 - random() 397d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters z = NV_MAGICCONST*(u1-0.5)/u2 398d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters zz = z*z/4.0 399d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if zz <= -_log(u2): 400d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters break 401d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return mu + z*sigma 402ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 403cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- lognormal distribution -------------------- 404ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 405d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def lognormvariate(self, mu, sigma): 406c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Log normal distribution. 407c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 408c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger If you take the natural logarithm of this distribution, you'll get a 409c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger normal distribution with mean mu and standard deviation sigma. 410c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger mu can have any value, and sigma must be greater than zero. 411ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 412c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 413d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return _exp(self.normalvariate(mu, sigma)) 414ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 415cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- exponential distribution -------------------- 416ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 417d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def expovariate(self, lambd): 418c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Exponential distribution. 419c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 420e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson lambd is 1.0 divided by the desired mean. It should be 421e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson nonzero. (The parameter would be called "lambda", but that is 422e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson a reserved word in Python.) Returned values range from 0 to 423e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson positive infinity if lambd is positive, and from negative 424e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson infinity to 0 if lambd is negative. 425ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 426c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 427d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # lambd: rate lambd = 1/mean 428d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # ('lambda' is a Python reserved word) 429ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 430cba87311d2dc395cbc56d00d7161d191ff7375d2Raymond Hettinger # we use 1-random() instead of random() to preclude the 431cba87311d2dc395cbc56d00d7161d191ff7375d2Raymond Hettinger # possibility of taking the log of zero. 432cba87311d2dc395cbc56d00d7161d191ff7375d2Raymond Hettinger return -_log(1.0 - self.random())/lambd 433ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 434cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- von Mises distribution -------------------- 435ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 436d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def vonmisesvariate(self, mu, kappa): 437c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Circular data distribution. 438ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 439c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger mu is the mean angle, expressed in radians between 0 and 2*pi, and 440c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger kappa is the concentration parameter, which must be greater than or 441c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger equal to zero. If kappa is equal to zero, this distribution reduces 442c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger to a uniform random angle over the range 0 to 2*pi. 443ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 444c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 445d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # mu: mean angle (in radians between 0 and 2*pi) 446d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # kappa: concentration parameter kappa (>= 0) 447d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # if kappa = 0 generate uniform random angle 4485810297052003f28788f6790ac799fe8e5373494Guido van Rossum 449d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Based upon an algorithm published in: Fisher, N.I., 450d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # "Statistical Analysis of Circular Data", Cambridge 451d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # University Press, 1993. 4525810297052003f28788f6790ac799fe8e5373494Guido van Rossum 453d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Thanks to Magnus Kessler for a correction to the 454d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # implementation of step 4. 4555810297052003f28788f6790ac799fe8e5373494Guido van Rossum 456d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters random = self.random 457d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if kappa <= 1e-6: 458d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return TWOPI * random() 459ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 460d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa) 461d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters b = (a - _sqrt(2.0 * a))/(2.0 * kappa) 462d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters r = (1.0 + b * b)/(2.0 * b) 463ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 46442406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger while 1: 465d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u1 = random() 466ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 467d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters z = _cos(_pi * u1) 468d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters f = (1.0 + r * z)/(r + z) 469d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters c = kappa * (r - f) 470ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 471d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u2 = random() 472ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 47342406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c): 474d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters break 475ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 476d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u3 = random() 477d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if u3 > 0.5: 4789aaeb5e0c8b5946b305590eb85312c282a457098Mark Dickinson theta = (mu + _acos(f)) % TWOPI 479d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters else: 4809aaeb5e0c8b5946b305590eb85312c282a457098Mark Dickinson theta = (mu - _acos(f)) % TWOPI 481ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 482d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return theta 483ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 484cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- gamma distribution -------------------- 485ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 486d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def gammavariate(self, alpha, beta): 487c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Gamma distribution. Not the gamma function! 488c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 489c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger Conditions on the parameters are alpha > 0 and beta > 0. 490c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 491405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger The probability distribution function is: 492405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger 493405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger x ** (alpha - 1) * math.exp(-x / beta) 494405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger pdf(x) = -------------------------------------- 495405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger math.gamma(alpha) * beta ** alpha 496405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger 497c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 4988ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters 499b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 5008ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters 501570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum # Warning: a few older sources define the gamma distribution in terms 502570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum # of alpha > -1.0 503570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum if alpha <= 0.0 or beta <= 0.0: 504570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum raise ValueError, 'gammavariate: alpha and beta must be > 0.0' 5058ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters 506d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters random = self.random 507d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if alpha > 1.0: 508d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 509d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Uses R.C.H. Cheng, "The generation of Gamma 510d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # variables with non-integral shape parameters", 511d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Applied Statistics, (1977), 26, No. 1, p71-74 512d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 513ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger ainv = _sqrt(2.0 * alpha - 1.0) 514ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger bbb = alpha - LOG4 515ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger ccc = alpha + ainv 5168ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters 51742406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger while 1: 518d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u1 = random() 51973ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger if not 1e-7 < u1 < .9999999: 52073ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger continue 52173ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger u2 = 1.0 - random() 522d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters v = _log(u1/(1.0-u1))/ainv 523d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters x = alpha*_exp(v) 524d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters z = u1*u1*u2 525d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters r = bbb+ccc*v-x 526d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): 527b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger return x * beta 528d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 529d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters elif alpha == 1.0: 530d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # expovariate(1) 5310c9886d589ddebf32de0ca3f027a173222ed383aTim Peters u = random() 532d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters while u <= 1e-7: 533d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u = random() 534b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger return -_log(u) * beta 535d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 536d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters else: # alpha is between 0 and 1 (exclusive) 537d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 538d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle 539d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 54042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger while 1: 541d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u = random() 542d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters b = (_e + alpha)/_e 543d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters p = b*u 544d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if p <= 1.0: 54542406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger x = p ** (1.0/alpha) 546d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters else: 547d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters x = -_log((b-p)/alpha) 548d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters u1 = random() 54942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger if p > 1.0: 55042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger if u1 <= x ** (alpha - 1.0): 55142406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger break 55242406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger elif u1 <= _exp(-x): 553d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters break 554b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger return x * beta 555b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger 556cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Gauss (faster alternative) -------------------- 55795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 558d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def gauss(self, mu, sigma): 559c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Gaussian distribution. 560c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 561c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger mu is the mean, and sigma is the standard deviation. This is 562c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger slightly faster than the normalvariate() function. 563c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 564c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger Not thread-safe without a lock around calls. 565ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 566c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 567d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 568d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # When x and y are two variables from [0, 1), uniformly 569d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # distributed, then 570d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # 571d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # cos(2*pi*x)*sqrt(-2*log(1-y)) 572d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # sin(2*pi*x)*sqrt(-2*log(1-y)) 573d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # 574d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # are two *independent* variables with normal distribution 575d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # (mu = 0, sigma = 1). 576d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # (Lambert Meertens) 577d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # (corrected version; bug discovered by Mike Miller, fixed by LM) 578d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 579d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Multithreading note: When two threads call this function 580d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # simultaneously, it is possible that they will receive the 581d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # same return value. The window is very small though. To 582d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # avoid this, you have to use a lock around all calls. (I 583d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # didn't want to slow this down in the serial case by using a 584d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # lock here.) 585d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 586d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters random = self.random 587d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters z = self.gauss_next 588d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters self.gauss_next = None 589d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters if z is None: 590d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters x2pi = random() * TWOPI 591d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters g2rad = _sqrt(-2.0 * _log(1.0 - random())) 592d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters z = _cos(x2pi) * g2rad 593d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters self.gauss_next = _sin(x2pi) * g2rad 594d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 595d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return mu + z*sigma 59695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 597cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- beta -------------------- 59885e2e4742d0a1accecd02058a7907df36308297eTim Peters## See 5991bb18cc39e21fb0acbfde6dadbd6c432f19c4513Ezio Melotti## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html 60085e2e4742d0a1accecd02058a7907df36308297eTim Peters## for Ivan Frohne's insightful analysis of why the original implementation: 60185e2e4742d0a1accecd02058a7907df36308297eTim Peters## 60285e2e4742d0a1accecd02058a7907df36308297eTim Peters## def betavariate(self, alpha, beta): 60385e2e4742d0a1accecd02058a7907df36308297eTim Peters## # Discrete Event Simulation in C, pp 87-88. 60485e2e4742d0a1accecd02058a7907df36308297eTim Peters## 60585e2e4742d0a1accecd02058a7907df36308297eTim Peters## y = self.expovariate(alpha) 60685e2e4742d0a1accecd02058a7907df36308297eTim Peters## z = self.expovariate(1.0/beta) 60785e2e4742d0a1accecd02058a7907df36308297eTim Peters## return z/(y+z) 60885e2e4742d0a1accecd02058a7907df36308297eTim Peters## 60985e2e4742d0a1accecd02058a7907df36308297eTim Peters## was dead wrong, and how it probably got that way. 61095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 611d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def betavariate(self, alpha, beta): 612c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Beta distribution. 613c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 6141b0ce8527112b997194a4e2fb9a1a850c6d73ee8Raymond Hettinger Conditions on the parameters are alpha > 0 and beta > 0. 615c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger Returned values range between 0 and 1. 616ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 617c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 618ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 61985e2e4742d0a1accecd02058a7907df36308297eTim Peters # This version due to Janne Sinkkonen, and matches all the std 62085e2e4742d0a1accecd02058a7907df36308297eTim Peters # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). 62185e2e4742d0a1accecd02058a7907df36308297eTim Peters y = self.gammavariate(alpha, 1.) 62285e2e4742d0a1accecd02058a7907df36308297eTim Peters if y == 0: 62385e2e4742d0a1accecd02058a7907df36308297eTim Peters return 0.0 62485e2e4742d0a1accecd02058a7907df36308297eTim Peters else: 62585e2e4742d0a1accecd02058a7907df36308297eTim Peters return y / (y + self.gammavariate(beta, 1.)) 62695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum 627cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Pareto -------------------- 628cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum 629d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def paretovariate(self, alpha): 630c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Pareto distribution. alpha is the shape parameter.""" 631d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Jain, pg. 495 632cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum 63373ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger u = 1.0 - self.random() 634d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return 1.0 / pow(u, 1.0/alpha) 635cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum 636cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Weibull -------------------- 637cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum 638d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters def weibullvariate(self, alpha, beta): 639c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """Weibull distribution. 640c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger 641c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger alpha is the scale parameter and beta is the shape parameter. 642ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger 643c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger """ 644d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters # Jain, pg. 499; bug fix courtesy Bill Arms 645cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum 64673ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger u = 1.0 - self.random() 647d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters return alpha * pow(-_log(u), 1.0/beta) 6486c395ba31609eeffce2428280cc5d95e4fb8058aGuido van Rossum 64940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger## -------------------- Wichmann-Hill ------------------- 65040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 65140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettingerclass WichmannHill(Random): 65240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 65340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger VERSION = 1 # used by getstate/setstate 65440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 65540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def seed(self, a=None): 65640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Initialize internal state from hashable object. 65740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 65823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger None or no argument seeds from current time or from an operating 65923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger system specific randomness source if available. 66040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 66140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger If a is not None or an int or long, hash(a) is used instead. 66240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 66340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger If a is an int or long, a is used directly. Distinct values between 66440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 0 and 27814431486575L inclusive are guaranteed to yield distinct 66540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger internal states (this guarantee is specific to the default 66640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger Wichmann-Hill generator). 66740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """ 66840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 66940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if a is None: 670c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger try: 671c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger a = long(_hexlify(_urandom(16)), 16) 672c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger except NotImplementedError: 673356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger import time 674356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger a = long(time.time() * 256) # use fractional seconds 67540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 67640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if not isinstance(a, (int, long)): 67740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a = hash(a) 67840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 67940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a, x = divmod(a, 30268) 68040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a, y = divmod(a, 30306) 68140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a, z = divmod(a, 30322) 68240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self._seed = int(x)+1, int(y)+1, int(z)+1 68340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 68440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self.gauss_next = None 68540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 68640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def random(self): 68740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Get the next random number in the range [0.0, 1.0).""" 68840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 68940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Wichman-Hill random number generator. 69040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # 69140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Wichmann, B. A. & Hill, I. D. (1982) 69240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Algorithm AS 183: 69340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # An efficient and portable pseudo-random number generator 69440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Applied Statistics 31 (1982) 188-190 69540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # 69640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # see also: 69740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Correction to Algorithm AS 183 69840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Applied Statistics 33 (1984) 123 69940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # 70040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # McLeod, A. I. (1985) 70140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # A remark on Algorithm AS 183 70240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Applied Statistics 34 (1985),198-200 70340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 70440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # This part is thread-unsafe: 70540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # BEGIN CRITICAL SECTION 70640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger x, y, z = self._seed 70740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger x = (171 * x) % 30269 70840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger y = (172 * y) % 30307 70940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger z = (170 * z) % 30323 71040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self._seed = x, y, z 71140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # END CRITICAL SECTION 71240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 71340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Note: on a platform using IEEE-754 double arithmetic, this can 71440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # never return 0.0 (asserted by Tim; proof too long for a comment). 71540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 71640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 71740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def getstate(self): 71840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Return internal state; can be passed to setstate() later.""" 71940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger return self.VERSION, self._seed, self.gauss_next 72040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 72140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def setstate(self, state): 72240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Restore internal state from object returned by getstate().""" 72340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger version = state[0] 72440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if version == 1: 72540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger version, self._seed, self.gauss_next = state 72640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger else: 72740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger raise ValueError("state with version %s passed to " 72840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger "Random.setstate() of version %s" % 72940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger (version, self.VERSION)) 73040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 73140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def jumpahead(self, n): 73240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Act as if n calls to random() were made, but quickly. 73340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 73440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger n is an int, greater than or equal to 0. 73540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 73640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger Example use: If you have 2 threads and know that each will 73740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger consume no more than a million random numbers, create two Random 73840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger objects r1 and r2, then do 73940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger r2.setstate(r1.getstate()) 74040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger r2.jumpahead(1000000) 74140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger Then r1 and r2 will use guaranteed-disjoint segments of the full 74240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger period. 74340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """ 74440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 74540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if not n >= 0: 74640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger raise ValueError("n must be >= 0") 74740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger x, y, z = self._seed 74840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger x = int(x * pow(171, n, 30269)) % 30269 74940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger y = int(y * pow(172, n, 30307)) % 30307 75040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger z = int(z * pow(170, n, 30323)) % 30323 75140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self._seed = x, y, z 75240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 75340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def __whseed(self, x=0, y=0, z=0): 75440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Set the Wichmann-Hill seed from (x, y, z). 75540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 75640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger These must be integers in the range [0, 256). 75740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """ 75840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 75940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if not type(x) == type(y) == type(z) == int: 76040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger raise TypeError('seeds must be integers') 76140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256): 76240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger raise ValueError('seeds must be in range(0, 256)') 76340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if 0 == x == y == z: 76440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Initialize from current time 76540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger import time 76640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger t = long(time.time() * 256) 76740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger t = int((t&0xffffff) ^ (t>>24)) 76840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger t, x = divmod(t, 256) 76940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger t, y = divmod(t, 256) 77040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger t, z = divmod(t, 256) 77140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # Zero is a poor seed, so substitute 1 77240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self._seed = (x or 1, y or 1, z or 1) 77340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 77440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self.gauss_next = None 77540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 77640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger def whseed(self, a=None): 77740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """Seed from hashable object's hash code. 77840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 77940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger None or no argument seeds from current time. It is not guaranteed 78040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger that objects with distinct hash codes lead to distinct internal 78140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger states. 78240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 78340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger This is obsolete, provided for compatibility with the seed routine 78440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger used prior to Python 2.1. Use the .seed() method instead. 78540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger """ 78640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 78740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger if a is None: 78840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self.__whseed() 78940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger return 79040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a = hash(a) 79140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a, x = divmod(a, 256) 79240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a, y = divmod(a, 256) 79340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger a, z = divmod(a, 256) 79440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger x = (x + a) % 256 or 1 79540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger y = (y + a) % 256 or 1 79640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger z = (z + a) % 256 or 1 79740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger self.__whseed(x, y, z) 79840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 79923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger## --------------- Operating System Random Source ------------------ 800356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 80123f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettingerclass SystemRandom(Random): 80223f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger """Alternate random number generator using sources provided 80323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger by the operating system (such as /dev/urandom on Unix or 80423f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger CryptGenRandom on Windows). 805356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 806356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger Not available on all systems (see os.urandom() for details). 807356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger """ 808356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 809356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger def random(self): 810356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger """Get the next random number in the range [0.0, 1.0).""" 8117c2a85b2d44851c2442ade579b760f86447bf848Tim Peters return (long(_hexlify(_urandom(7)), 16) >> 3) * RECIP_BPF 812356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 813356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger def getrandbits(self, k): 814356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger """getrandbits(k) -> x. Generates a long int with k random bits.""" 815356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger if k <= 0: 816356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger raise ValueError('number of bits must be greater than zero') 817356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger if k != int(k): 818356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger raise TypeError('number of bits should be an integer') 819356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger bytes = (k + 7) // 8 # bits / 8 and rounded up 820356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger x = long(_hexlify(_urandom(bytes)), 16) 821356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger return x >> (bytes * 8 - k) # trim excess bits 822356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 823356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger def _stub(self, *args, **kwds): 82423f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger "Stub method. Not used for a system random number generator." 825356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger return None 826356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger seed = jumpahead = _stub 827356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 828356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger def _notimplemented(self, *args, **kwds): 82923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger "Method should not be called for a system random number generator." 83023f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger raise NotImplementedError('System entropy source does not have state.') 831356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger getstate = setstate = _notimplemented 832356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger 833cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- test program -------------------- 834ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 83562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettingerdef _test_generator(n, func, args): 8360c9886d589ddebf32de0ca3f027a173222ed383aTim Peters import time 83762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger print n, 'times', func.__name__ 838b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger total = 0.0 8390c9886d589ddebf32de0ca3f027a173222ed383aTim Peters sqsum = 0.0 8400c9886d589ddebf32de0ca3f027a173222ed383aTim Peters smallest = 1e10 8410c9886d589ddebf32de0ca3f027a173222ed383aTim Peters largest = -1e10 8420c9886d589ddebf32de0ca3f027a173222ed383aTim Peters t0 = time.time() 8430c9886d589ddebf32de0ca3f027a173222ed383aTim Peters for i in range(n): 84462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger x = func(*args) 845b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger total += x 8460c9886d589ddebf32de0ca3f027a173222ed383aTim Peters sqsum = sqsum + x*x 8470c9886d589ddebf32de0ca3f027a173222ed383aTim Peters smallest = min(x, smallest) 8480c9886d589ddebf32de0ca3f027a173222ed383aTim Peters largest = max(x, largest) 8490c9886d589ddebf32de0ca3f027a173222ed383aTim Peters t1 = time.time() 8500c9886d589ddebf32de0ca3f027a173222ed383aTim Peters print round(t1-t0, 3), 'sec,', 851b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger avg = total/n 852d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters stddev = _sqrt(sqsum/n - avg*avg) 8530c9886d589ddebf32de0ca3f027a173222ed383aTim Peters print 'avg %g, stddev %g, min %g, max %g' % \ 8540c9886d589ddebf32de0ca3f027a173222ed383aTim Peters (avg, stddev, smallest, largest) 855ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum 856f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger 857f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingerdef _test(N=2000): 85862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, random, ()) 85962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, normalvariate, (0.0, 1.0)) 86062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, lognormvariate, (0.0, 1.0)) 86162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, vonmisesvariate, (0.0, 1.0)) 86262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (0.01, 1.0)) 86362297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (0.1, 1.0)) 86462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (0.1, 2.0)) 86562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (0.5, 1.0)) 86662297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (0.9, 1.0)) 86762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (1.0, 1.0)) 86862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (2.0, 1.0)) 86962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (20.0, 1.0)) 87062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gammavariate, (200.0, 1.0)) 87162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, gauss, (0.0, 1.0)) 87262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger _test_generator(N, betavariate, (3.0, 3.0)) 873bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0)) 874cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters 875715c4c412b21f68ad59773698d06eea8eb0c5a44Tim Peters# Create one instance, seeded from current time, and export its methods 87640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# as module-level functions. The functions share state across all uses 87740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger#(both in the user's code and in the Python libraries), but that's fine 87840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# for most programs and is easier for the casual user than making them 87940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# instantiate their own Random() instance. 88040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger 881d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters_inst = Random() 882d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersseed = _inst.seed 883d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandom = _inst.random 884d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersuniform = _inst.uniform 885bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettingertriangular = _inst.triangular 886d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandint = _inst.randint 887d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterschoice = _inst.choice 888d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandrange = _inst.randrange 889f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingersample = _inst.sample 890d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersshuffle = _inst.shuffle 891d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersnormalvariate = _inst.normalvariate 892d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterslognormvariate = _inst.lognormvariate 893d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersexpovariate = _inst.expovariate 894d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersvonmisesvariate = _inst.vonmisesvariate 895d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgammavariate = _inst.gammavariate 896d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgauss = _inst.gauss 897d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersbetavariate = _inst.betavariate 898d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersparetovariate = _inst.paretovariate 899d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersweibullvariate = _inst.weibullvariate 900d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgetstate = _inst.getstate 901d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterssetstate = _inst.setstate 902d52269bfd029c4a517ea74c17edd5c3a250c366cTim Petersjumpahead = _inst.jumpahead 9032f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingergetrandbits = _inst.getrandbits 904d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters 905ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumif __name__ == '__main__': 906d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters _test() 907