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:
111ddb39e799d65748c5ea42c344170befc90af9e64Raymond Hettinger                # Seed with enough bytes to span the 19937 bit
112ddb39e799d65748c5ea42c344170befc90af9e64Raymond Hettinger                # state space for the Mersenne Twister
113ddb39e799d65748c5ea42c344170befc90af9e64Raymond Hettinger                a = long(_hexlify(_urandom(2500)), 16)
114c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            except NotImplementedError:
115356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                import time
116356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                a = long(time.time() * 256) # use fractional seconds
117356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
118145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger        super(Random, self).seed(a)
11946c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters        self.gauss_next = None
12046c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters
121d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def getstate(self):
122d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Return internal state; can be passed to setstate() later."""
123145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger        return self.VERSION, super(Random, self).getstate(), self.gauss_next
124d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
125d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def setstate(self, state):
126d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Restore internal state from object returned by getstate()."""
127d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        version = state[0]
1286b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis        if version == 3:
12940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            version, internalstate, self.gauss_next = state
130145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger            super(Random, self).setstate(internalstate)
1316b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis        elif version == 2:
1326b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            version, internalstate, self.gauss_next = state
1336b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            # In version 2, the state was saved as signed ints, which causes
1346b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   inconsistencies between 32/64-bit systems. The state is
1356b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   really unsigned 32-bit ints, so we convert negative ints from
1366b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   version 2 to positive longs for version 3.
1376b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            try:
1386b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis                internalstate = tuple( long(x) % (2**32) for x in internalstate )
1396b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            except ValueError, e:
1406b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis                raise TypeError, e
1416b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            super(Random, self).setstate(internalstate)
142d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
143d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError("state with version %s passed to "
144d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                             "Random.setstate() of version %s" %
145d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                             (version, self.VERSION))
146d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
147ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger    def jumpahead(self, n):
148ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        """Change the internal state to one that is likely far away
149ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        from the current state.  This method will not be in Py3.x,
150ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        so it is better to simply reseed.
151ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        """
152ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        # The super.jumpahead() method uses shuffling to change state,
153ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        # so it needs a large and "interesting" n to work with.  Here,
154ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        # we use hashing to create a large n for the shuffle.
155ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        s = repr(n) + repr(self.getstate())
156ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        n = int(_hashlib.new('sha512', s).hexdigest(), 16)
157ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger        super(Random, self).jumpahead(n)
158ffd2a4215a0bfe82f48ff71381bbfce8552f5f0cRaymond Hettinger
159cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- Methods below this point do not need to be overridden when
160cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- subclassing for the purpose of using a different core generator.
161d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
162cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- pickle support  -------------------
163d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
164cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters    def __getstate__(self): # for pickle
165cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        return self.getstate()
166d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
167cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters    def __setstate__(self, state):  # for pickle
168cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        self.setstate(state)
169cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
1705f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger    def __reduce__(self):
1715f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger        return self.__class__, (), self.getstate()
1725f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger
173cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- integer methods  -------------------
174d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
1758dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger    def randrange(self, start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF):
176d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Choose a random item from range(start, stop[, step]).
177d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
178d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        This fixes the problem with randint() which includes the
179d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        endpoint; in Python this is usually not what you want.
1808dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger
181d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
182d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
183d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # This code is a bit messy to make it fast for the
1849146f27b7799dab231083f194a14c6157b57549fTim Peters        # common case while still doing adequate error checking.
1858dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        istart = _int(start)
186d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istart != start:
187d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer arg 1 for randrange()"
1888dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        if stop is None:
189d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            if istart > 0:
1908dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger                if istart >= _maxwidth:
1912f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                    return self._randbelow(istart)
1928dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger                return _int(self.random() * istart)
193d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "empty range for randrange()"
1949146f27b7799dab231083f194a14c6157b57549fTim Peters
1959146f27b7799dab231083f194a14c6157b57549fTim Peters        # stop argument supplied.
1968dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        istop = _int(stop)
197d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istop != stop:
198d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer stop for randrange()"
1992f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        width = istop - istart
2002f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if step == 1 and width > 0:
20176ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # Note that
2022f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            #     int(istart + self.random()*width)
20376ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # instead would be incorrect.  For example, consider istart
20476ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # = -2 and istop = 0.  Then the guts would be in
20576ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # -2.0 to 0.0 exclusive on both ends (ignoring that random()
20676ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # might return 0.0), and because int() truncates toward 0, the
20776ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # final result would be -1 or 0 (instead of -2 or -1).
2082f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            #     istart + int(self.random()*width)
20976ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # would also be incorrect, for a subtler reason:  the RHS
21076ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # can return a long, and then randrange() would also return
21176ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # a long, but we're supposed to return an int (for backward
21276ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # compatibility).
2132f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2148dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger            if width >= _maxwidth:
2158dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger                return _int(istart + self._randbelow(width))
2168dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger            return _int(istart + _int(self.random()*width))
217d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if step == 1:
2182f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width)
2199146f27b7799dab231083f194a14c6157b57549fTim Peters
2209146f27b7799dab231083f194a14c6157b57549fTim Peters        # Non-unit step argument supplied.
2218dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        istep = _int(step)
222d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istep != step:
223d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer step for randrange()"
224d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istep > 0:
225ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger            n = (width + istep - 1) // istep
226d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        elif istep < 0:
227ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger            n = (width + istep + 1) // istep
228d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
229d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "zero step for randrange()"
230d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
231d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if n <= 0:
232d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "empty range for randrange()"
2332f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2348dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        if n >= _maxwidth:
23594547f7646895e032f8fc145529d9efc3a70760dRaymond Hettinger            return istart + istep*self._randbelow(n)
2368dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        return istart + istep*_int(self.random() * n)
237d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
238d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def randint(self, a, b):
239cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        """Return random integer in range [a, b], including both end points.
240d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
241d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
242d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return self.randrange(a, b+1)
243d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
2448dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger    def _randbelow(self, n, _log=_log, _int=int, _maxwidth=1L<<BPF,
2452f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                   _Method=_MethodType, _BuiltinMethod=_BuiltinMethodType):
2462f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        """Return a random int in the range [0,n)
2472f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2482f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        Handles the case where n has more bits than returned
2492f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        by a single call to the underlying generator.
2502f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        """
2512f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2522f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        try:
2532f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            getrandbits = self.getrandbits
2542f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        except AttributeError:
2552f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            pass
2562f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        else:
2572f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # Only call self.getrandbits if the original random() builtin method
2582f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # has not been overridden or if a new getrandbits() was supplied.
2592f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # This assures that the two methods correspond.
2602f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            if type(self.random) is _BuiltinMethod or type(getrandbits) is _Method:
2618dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger                k = _int(1.00001 + _log(n-1, 2.0))   # 2**k > n-1 > 2**(k-2)
2622f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                r = getrandbits(k)
2632f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                while r >= n:
2642f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                    r = getrandbits(k)
2652f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                return r
2662f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if n >= _maxwidth:
2672f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            _warn("Underlying random() generator does not supply \n"
2682f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                "enough bits to choose from a population range this large")
2698dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        return _int(self.random() * n)
2702f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
271cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- sequence methods  -------------------
272cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
273d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def choice(self, seq):
274d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Choose a random element from a non-empty sequence."""
2755dae505bbd59641a948c81bea981e7c44d4c2343Raymond Hettinger        return seq[int(self.random() * len(seq))]  # raises IndexError if seq is empty
276d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
2778dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger    def shuffle(self, x, random=None):
278d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """x, random=random.random -> shuffle list x in place; return None.
279d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
280d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        Optional arg random is a 0-argument function returning a random
281d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        float in [0.0, 1.0); by default, the standard random.random.
28237851d0e55b4f759dadf2ed6dc8ce7a28197e49fSenthil Kumaran
283d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
284d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
285d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if random is None:
286d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            random = self.random
2878dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger        _int = int
28885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger        for i in reversed(xrange(1, len(x))):
289cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters            # pick an element in x[:i+1] with which to exchange x[i]
2908dc1692337c4551a6ccf27091478f67027b573c4Raymond Hettinger            j = _int(random() * (i+1))
291d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            x[i], x[j] = x[j], x[i]
292d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
293fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger    def sample(self, population, k):
294f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        """Chooses k unique random elements from a population sequence.
295f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
296c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        Returns a new list containing elements from the population while
297c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        leaving the original population unchanged.  The resulting list is
298c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        in selection order so that all sub-slices will also be valid random
299c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        samples.  This allows raffle winners (the sample) to be partitioned
300c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        into grand prize and second place winners (the subslices).
301f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
302c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        Members of the population need not be hashable or unique.  If the
303c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        population contains repeats, then each occurrence is a possible
304c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        selection in the sample.
305f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
306c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        To choose a sample in a range of integers, use xrange as an argument.
307c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        This is especially fast and space efficient for sampling from a
308c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        large population:   sample(xrange(10000000), 60)
309f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        """
310f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
311c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        # Sampling without replacement entails tracking either potential
31291e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # selections (the pool) in a list or previous selections in a set.
313c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger
3142b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # When the number of selections is small compared to the
3152b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # population, then tracking selections is efficient, requiring
31691e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # only a small set and an occasional reselection.  For
3172b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # a larger number of selections, the pool tracking method is
3182b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # preferred since the list takes less space than the
31991e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # set and it doesn't suffer from frequent reselections.
320c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger
321f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        n = len(population)
322f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        if not 0 <= k <= n:
32322d8f7b9b80cf4f89ad2c383e566f8fd1c6d5e52Raymond Hettinger            raise ValueError("sample larger than population")
3248b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger        random = self.random
325fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger        _int = int
326c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        result = [None] * k
32791e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        setsize = 21        # size of a small set minus size of an empty list
32891e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        if k > 5:
3299e34c047325651853a95f95e538582a4f6d5b7f6Tim Peters            setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
330c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        if n <= setsize or hasattr(population, "keys"):
331c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            # An n-length list is smaller than a k-length set, or this is a
332c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            # mapping type so the other algorithm wouldn't work.
333311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger            pool = list(population)
334311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger            for i in xrange(k):         # invariant:  non-selected at [0,n-i)
335fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger                j = _int(random() * (n-i))
336311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger                result[i] = pool[j]
3378b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger                pool[j] = pool[n-i-1]   # move non-selected item into vacancy
338c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        else:
33966d09f1b3029d9cf975ccf26c437c9fb2605db91Raymond Hettinger            try:
3403c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                selected = set()
3413c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                selected_add = selected.add
3423c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                for i in xrange(k):
343fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger                    j = _int(random() * n)
3443c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    while j in selected:
3453c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                        j = _int(random() * n)
3463c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    selected_add(j)
3473c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    result[i] = population[j]
348c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            except (TypeError, KeyError):   # handle (at least) sets
3493c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                if isinstance(population, list):
3503c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    raise
351c17976e9833f3093adb1019356737e728a24f7c9Tim Peters                return self.sample(tuple(population), k)
352311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger        return result
353f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
354cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- real-valued distributions  -------------------
355cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
356cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- uniform distribution -------------------
357d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
358d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def uniform(self, a, b):
3592c0cdca56447d33e714a010459ee4318fff89c66Raymond Hettinger        "Get a random number in the range [a, b) or [a, b] depending on rounding."
360d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return a + (b-a) * self.random()
361ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
362bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger## -------------------- triangular --------------------
363bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
364c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger    def triangular(self, low=0.0, high=1.0, mode=None):
365bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        """Triangular distribution.
366bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
367bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        Continuous distribution bounded by given lower and upper limits,
368bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        and having a given mode value in-between.
369bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
370bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        http://en.wikipedia.org/wiki/Triangular_distribution
371bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
372bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        """
373bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        u = self.random()
37492df7529cb6c863d0fcd3247829b24833f62e285Raymond Hettinger        try:
37592df7529cb6c863d0fcd3247829b24833f62e285Raymond Hettinger            c = 0.5 if mode is None else (mode - low) / (high - low)
37692df7529cb6c863d0fcd3247829b24833f62e285Raymond Hettinger        except ZeroDivisionError:
37792df7529cb6c863d0fcd3247829b24833f62e285Raymond Hettinger            return low
378bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        if u > c:
379c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger            u = 1.0 - u
380c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger            c = 1.0 - c
381bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger            low, high = high, low
382bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        return low + (high - low) * (u * c) ** 0.5
383bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
384cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- normal distribution --------------------
385ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
386d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def normalvariate(self, mu, sigma):
387c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Normal distribution.
388c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
389c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean, and sigma is the standard deviation.
390ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
391c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
392d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # mu = mean, sigma = standard deviation
393d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
394d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Uses Kinderman and Monahan method. Reference: Kinderman,
395d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # A.J. and Monahan, J.F., "Computer generation of random
396d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # variables using the ratio of uniform deviates", ACM Trans
397d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Math Software, 3, (1977), pp257-260.
398d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
399d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
40042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger        while 1:
401d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u1 = random()
40273ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger            u2 = 1.0 - random()
403d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = NV_MAGICCONST*(u1-0.5)/u2
404d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            zz = z*z/4.0
405d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            if zz <= -_log(u2):
406d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                break
407d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return mu + z*sigma
408ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
409cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- lognormal distribution --------------------
410ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
411d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def lognormvariate(self, mu, sigma):
412c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Log normal distribution.
413c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
414c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        If you take the natural logarithm of this distribution, you'll get a
415c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        normal distribution with mean mu and standard deviation sigma.
416c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu can have any value, and sigma must be greater than zero.
417ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
418c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
419d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return _exp(self.normalvariate(mu, sigma))
420ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
421cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- exponential distribution --------------------
422ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
423d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def expovariate(self, lambd):
424c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Exponential distribution.
425c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
426e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson        lambd is 1.0 divided by the desired mean.  It should be
427e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson        nonzero.  (The parameter would be called "lambda", but that is
428e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson        a reserved word in Python.)  Returned values range from 0 to
429e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson        positive infinity if lambd is positive, and from negative
430e6dc53120d52f58057fd1a6d666d21cb9d71c08dMark Dickinson        infinity to 0 if lambd is negative.
431ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
432c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
433d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # lambd: rate lambd = 1/mean
434d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # ('lambda' is a Python reserved word)
435ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
436cba87311d2dc395cbc56d00d7161d191ff7375d2Raymond Hettinger        # we use 1-random() instead of random() to preclude the
437cba87311d2dc395cbc56d00d7161d191ff7375d2Raymond Hettinger        # possibility of taking the log of zero.
438cba87311d2dc395cbc56d00d7161d191ff7375d2Raymond Hettinger        return -_log(1.0 - self.random())/lambd
439ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
440cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- von Mises distribution --------------------
441ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
442d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def vonmisesvariate(self, mu, kappa):
443c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Circular data distribution.
444ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
445c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean angle, expressed in radians between 0 and 2*pi, and
446c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        kappa is the concentration parameter, which must be greater than or
447c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        equal to zero.  If kappa is equal to zero, this distribution reduces
448c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        to a uniform random angle over the range 0 to 2*pi.
449ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
450c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
451d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # mu:    mean angle (in radians between 0 and 2*pi)
452d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # kappa: concentration parameter kappa (>= 0)
453d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # if kappa = 0 generate uniform random angle
4545810297052003f28788f6790ac799fe8e5373494Guido van Rossum
455d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Based upon an algorithm published in: Fisher, N.I.,
456d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # "Statistical Analysis of Circular Data", Cambridge
457d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # University Press, 1993.
4585810297052003f28788f6790ac799fe8e5373494Guido van Rossum
459d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Thanks to Magnus Kessler for a correction to the
460d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # implementation of step 4.
4615810297052003f28788f6790ac799fe8e5373494Guido van Rossum
462d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
463d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if kappa <= 1e-6:
464d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            return TWOPI * random()
465ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
46665d56390bbf74553221dd94123c9f04776c6f8cbSerhiy Storchaka        s = 0.5 / kappa
46765d56390bbf74553221dd94123c9f04776c6f8cbSerhiy Storchaka        r = s + _sqrt(1.0 + s * s)
468ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
46942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger        while 1:
470d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u1 = random()
471d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = _cos(_pi * u1)
472ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
47365d56390bbf74553221dd94123c9f04776c6f8cbSerhiy Storchaka            d = z / (r + z)
474d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u2 = random()
47565d56390bbf74553221dd94123c9f04776c6f8cbSerhiy Storchaka            if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
476d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                break
477ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
47865d56390bbf74553221dd94123c9f04776c6f8cbSerhiy Storchaka        q = 1.0 / r
47965d56390bbf74553221dd94123c9f04776c6f8cbSerhiy Storchaka        f = (q + z) / (1.0 + q * z)
480d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        u3 = random()
481d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if u3 > 0.5:
4829aaeb5e0c8b5946b305590eb85312c282a457098Mark Dickinson            theta = (mu + _acos(f)) % TWOPI
483d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
4849aaeb5e0c8b5946b305590eb85312c282a457098Mark Dickinson            theta = (mu - _acos(f)) % TWOPI
485ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
486d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return theta
487ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
488cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- gamma distribution --------------------
489ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
490d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def gammavariate(self, alpha, beta):
491c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Gamma distribution.  Not the gamma function!
492c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
493c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Conditions on the parameters are alpha > 0 and beta > 0.
494c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
495405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger        The probability distribution function is:
496405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger
497405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger                    x ** (alpha - 1) * math.exp(-x / beta)
498405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger          pdf(x) =  --------------------------------------
499405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger                      math.gamma(alpha) * beta ** alpha
500405a4717e1108b95d5af0e61dd304fe6407bd256Raymond Hettinger
501c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
5028ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
503b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger        # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
5048ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
505570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        # Warning: a few older sources define the gamma distribution in terms
506570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        # of alpha > -1.0
507570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        if alpha <= 0.0 or beta <= 0.0:
508570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum            raise ValueError, 'gammavariate: alpha and beta must be > 0.0'
5098ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
510d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
511d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if alpha > 1.0:
512d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
513d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Uses R.C.H. Cheng, "The generation of Gamma
514d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # variables with non-integral shape parameters",
515d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Applied Statistics, (1977), 26, No. 1, p71-74
516d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
517ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            ainv = _sqrt(2.0 * alpha - 1.0)
518ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            bbb = alpha - LOG4
519ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            ccc = alpha + ainv
5208ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
52142406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            while 1:
522d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u1 = random()
52373ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                if not 1e-7 < u1 < .9999999:
52473ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                    continue
52573ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                u2 = 1.0 - random()
526d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                v = _log(u1/(1.0-u1))/ainv
527d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                x = alpha*_exp(v)
528d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                z = u1*u1*u2
529d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                r = bbb+ccc*v-x
530d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
531b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger                    return x * beta
532d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
533d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        elif alpha == 1.0:
534d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # expovariate(1)
5350c9886d589ddebf32de0ca3f027a173222ed383aTim Peters            u = random()
536d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            while u <= 1e-7:
537d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u = random()
538b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger            return -_log(u) * beta
539d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
540d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:   # alpha is between 0 and 1 (exclusive)
541d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
542d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
543d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
54442406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            while 1:
545d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u = random()
546d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                b = (_e + alpha)/_e
547d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                p = b*u
548d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                if p <= 1.0:
54942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                    x = p ** (1.0/alpha)
550d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                else:
551d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                    x = -_log((b-p)/alpha)
552d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u1 = random()
55342406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                if p > 1.0:
55442406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                    if u1 <= x ** (alpha - 1.0):
55542406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                        break
55642406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                elif u1 <= _exp(-x):
557d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                    break
558b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger            return x * beta
559b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger
560cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Gauss (faster alternative) --------------------
56195bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
562d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def gauss(self, mu, sigma):
563c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Gaussian distribution.
564c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
565c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean, and sigma is the standard deviation.  This is
566c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        slightly faster than the normalvariate() function.
567c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
568c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Not thread-safe without a lock around calls.
569ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
570c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
571d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
572d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # When x and y are two variables from [0, 1), uniformly
573d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # distributed, then
574d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #
575d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #    cos(2*pi*x)*sqrt(-2*log(1-y))
576d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #    sin(2*pi*x)*sqrt(-2*log(1-y))
577d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #
578d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # are two *independent* variables with normal distribution
579d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (mu = 0, sigma = 1).
580d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (Lambert Meertens)
581d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (corrected version; bug discovered by Mike Miller, fixed by LM)
582d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
583d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Multithreading note: When two threads call this function
584d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # simultaneously, it is possible that they will receive the
585d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # same return value.  The window is very small though.  To
586d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # avoid this, you have to use a lock around all calls.  (I
587d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # didn't want to slow this down in the serial case by using a
588d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # lock here.)
589d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
590d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
591d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        z = self.gauss_next
592d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        self.gauss_next = None
593d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if z is None:
594d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            x2pi = random() * TWOPI
595d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            g2rad = _sqrt(-2.0 * _log(1.0 - random()))
596d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = _cos(x2pi) * g2rad
597d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            self.gauss_next = _sin(x2pi) * g2rad
598d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
599d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return mu + z*sigma
60095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
601cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- beta --------------------
60285e2e4742d0a1accecd02058a7907df36308297eTim Peters## See
6031bb18cc39e21fb0acbfde6dadbd6c432f19c4513Ezio Melotti## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
60485e2e4742d0a1accecd02058a7907df36308297eTim Peters## for Ivan Frohne's insightful analysis of why the original implementation:
60585e2e4742d0a1accecd02058a7907df36308297eTim Peters##
60685e2e4742d0a1accecd02058a7907df36308297eTim Peters##    def betavariate(self, alpha, beta):
60785e2e4742d0a1accecd02058a7907df36308297eTim Peters##        # Discrete Event Simulation in C, pp 87-88.
60885e2e4742d0a1accecd02058a7907df36308297eTim Peters##
60985e2e4742d0a1accecd02058a7907df36308297eTim Peters##        y = self.expovariate(alpha)
61085e2e4742d0a1accecd02058a7907df36308297eTim Peters##        z = self.expovariate(1.0/beta)
61185e2e4742d0a1accecd02058a7907df36308297eTim Peters##        return z/(y+z)
61285e2e4742d0a1accecd02058a7907df36308297eTim Peters##
61385e2e4742d0a1accecd02058a7907df36308297eTim Peters## was dead wrong, and how it probably got that way.
61495bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
615d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def betavariate(self, alpha, beta):
616c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Beta distribution.
617c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
6181b0ce8527112b997194a4e2fb9a1a850c6d73ee8Raymond Hettinger        Conditions on the parameters are alpha > 0 and beta > 0.
619c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Returned values range between 0 and 1.
620ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
621c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
622ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
62385e2e4742d0a1accecd02058a7907df36308297eTim Peters        # This version due to Janne Sinkkonen, and matches all the std
62485e2e4742d0a1accecd02058a7907df36308297eTim Peters        # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
62585e2e4742d0a1accecd02058a7907df36308297eTim Peters        y = self.gammavariate(alpha, 1.)
62685e2e4742d0a1accecd02058a7907df36308297eTim Peters        if y == 0:
62785e2e4742d0a1accecd02058a7907df36308297eTim Peters            return 0.0
62885e2e4742d0a1accecd02058a7907df36308297eTim Peters        else:
62985e2e4742d0a1accecd02058a7907df36308297eTim Peters            return y / (y + self.gammavariate(beta, 1.))
63095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
631cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Pareto --------------------
632cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
633d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def paretovariate(self, alpha):
634c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Pareto distribution.  alpha is the shape parameter."""
635d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Jain, pg. 495
636cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
63773ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger        u = 1.0 - self.random()
638d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return 1.0 / pow(u, 1.0/alpha)
639cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
640cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Weibull --------------------
641cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
642d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def weibullvariate(self, alpha, beta):
643c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Weibull distribution.
644c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
645c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        alpha is the scale parameter and beta is the shape parameter.
646ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
647c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
648d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Jain, pg. 499; bug fix courtesy Bill Arms
649cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
65073ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger        u = 1.0 - self.random()
651d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return alpha * pow(-_log(u), 1.0/beta)
6526c395ba31609eeffce2428280cc5d95e4fb8058aGuido van Rossum
65340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger## -------------------- Wichmann-Hill -------------------
65440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettingerclass WichmannHill(Random):
65640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    VERSION = 1     # used by getstate/setstate
65840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def seed(self, a=None):
66040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Initialize internal state from hashable object.
66140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
66223f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        None or no argument seeds from current time or from an operating
66323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        system specific randomness source if available.
66440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
66540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        If a is not None or an int or long, hash(a) is used instead.
66640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
66740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        If a is an int or long, a is used directly.  Distinct values between
66840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        0 and 27814431486575L inclusive are guaranteed to yield distinct
66940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        internal states (this guarantee is specific to the default
67040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Wichmann-Hill generator).
67140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
67240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
67340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if a is None:
674c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            try:
675c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger                a = long(_hexlify(_urandom(16)), 16)
676c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            except NotImplementedError:
677356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                import time
678356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                a = long(time.time() * 256) # use fractional seconds
67940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
68040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not isinstance(a, (int, long)):
68140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            a = hash(a)
68240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
68340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, x = divmod(a, 30268)
68440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, y = divmod(a, 30306)
68540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, z = divmod(a, 30322)
68640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = int(x)+1, int(y)+1, int(z)+1
68740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
68840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
68940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
69040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def random(self):
69140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Get the next random number in the range [0.0, 1.0)."""
69240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
69340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Wichman-Hill random number generator.
69440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
69540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Wichmann, B. A. & Hill, I. D. (1982)
69640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Algorithm AS 183:
69740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # An efficient and portable pseudo-random number generator
69840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Applied Statistics 31 (1982) 188-190
69940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
70040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # see also:
70140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Correction to Algorithm AS 183
70240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Applied Statistics 33 (1984) 123
70340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
70440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        McLeod, A. I. (1985)
70540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        A remark on Algorithm AS 183
70640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Applied Statistics 34 (1985),198-200
70740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
70840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # This part is thread-unsafe:
70940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # BEGIN CRITICAL SECTION
71040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x, y, z = self._seed
71140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = (171 * x) % 30269
71240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = (172 * y) % 30307
71340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = (170 * z) % 30323
71440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = x, y, z
71540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # END CRITICAL SECTION
71640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
71740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Note:  on a platform using IEEE-754 double arithmetic, this can
71840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # never return 0.0 (asserted by Tim; proof too long for a comment).
71940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
72040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def getstate(self):
72240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Return internal state; can be passed to setstate() later."""
72340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        return self.VERSION, self._seed, self.gauss_next
72440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def setstate(self, state):
72640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Restore internal state from object returned by getstate()."""
72740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        version = state[0]
72840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if version == 1:
72940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            version, self._seed, self.gauss_next = state
73040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        else:
73140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError("state with version %s passed to "
73240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger                             "Random.setstate() of version %s" %
73340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger                             (version, self.VERSION))
73440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
73540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def jumpahead(self, n):
73640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Act as if n calls to random() were made, but quickly.
73740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
73840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        n is an int, greater than or equal to 0.
73940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Example use:  If you have 2 threads and know that each will
74140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        consume no more than a million random numbers, create two Random
74240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        objects r1 and r2, then do
74340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            r2.setstate(r1.getstate())
74440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            r2.jumpahead(1000000)
74540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Then r1 and r2 will use guaranteed-disjoint segments of the full
74640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        period.
74740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
74840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not n >= 0:
75040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError("n must be >= 0")
75140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x, y, z = self._seed
75240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = int(x * pow(171, n, 30269)) % 30269
75340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = int(y * pow(172, n, 30307)) % 30307
75440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = int(z * pow(170, n, 30323)) % 30323
75540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = x, y, z
75640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
75740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def __whseed(self, x=0, y=0, z=0):
75840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Set the Wichmann-Hill seed from (x, y, z).
75940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
76040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        These must be integers in the range [0, 256).
76140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
76240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
76340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not type(x) == type(y) == type(z) == int:
76440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise TypeError('seeds must be integers')
76540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256):
76640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError('seeds must be in range(0, 256)')
76740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if 0 == x == y == z:
76840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            # Initialize from current time
76940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            import time
77040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t = long(time.time() * 256)
77140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t = int((t&0xffffff) ^ (t>>24))
77240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, x = divmod(t, 256)
77340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, y = divmod(t, 256)
77440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, z = divmod(t, 256)
77540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Zero is a poor seed, so substitute 1
77640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = (x or 1, y or 1, z or 1)
77740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
77840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
77940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
78040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def whseed(self, a=None):
78140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Seed from hashable object's hash code.
78240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
78340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        None or no argument seeds from current time.  It is not guaranteed
78440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        that objects with distinct hash codes lead to distinct internal
78540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        states.
78640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
78740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        This is obsolete, provided for compatibility with the seed routine
78840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        used prior to Python 2.1.  Use the .seed() method instead.
78940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
79040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
79140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if a is None:
79240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            self.__whseed()
79340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            return
79440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a = hash(a)
79540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, x = divmod(a, 256)
79640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, y = divmod(a, 256)
79740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, z = divmod(a, 256)
79840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = (x + a) % 256 or 1
79940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = (y + a) % 256 or 1
80040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = (z + a) % 256 or 1
80140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.__whseed(x, y, z)
80240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
80323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger## --------------- Operating System Random Source  ------------------
804356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
80523f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettingerclass SystemRandom(Random):
80623f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    """Alternate random number generator using sources provided
80723f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    by the operating system (such as /dev/urandom on Unix or
80823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    CryptGenRandom on Windows).
809356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
810356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger     Not available on all systems (see os.urandom() for details).
811356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    """
812356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
813356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def random(self):
814356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        """Get the next random number in the range [0.0, 1.0)."""
8157c2a85b2d44851c2442ade579b760f86447bf848Tim Peters        return (long(_hexlify(_urandom(7)), 16) >> 3) * RECIP_BPF
816356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
817356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def getrandbits(self, k):
818356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        """getrandbits(k) -> x.  Generates a long int with k random bits."""
819356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        if k <= 0:
820356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger            raise ValueError('number of bits must be greater than zero')
821356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        if k != int(k):
822356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger            raise TypeError('number of bits should be an integer')
823356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        bytes = (k + 7) // 8                    # bits / 8 and rounded up
824356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        x = long(_hexlify(_urandom(bytes)), 16)
825356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        return x >> (bytes * 8 - k)             # trim excess bits
826356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
827356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def _stub(self, *args, **kwds):
82823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        "Stub method.  Not used for a system random number generator."
829356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        return None
830356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    seed = jumpahead = _stub
831356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
832356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def _notimplemented(self, *args, **kwds):
83323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        "Method should not be called for a system random number generator."
83423f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        raise NotImplementedError('System entropy source does not have state.')
835356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    getstate = setstate = _notimplemented
836356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
837cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- test program --------------------
838ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
83962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettingerdef _test_generator(n, func, args):
8400c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    import time
84162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    print n, 'times', func.__name__
842b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger    total = 0.0
8430c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    sqsum = 0.0
8440c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    smallest = 1e10
8450c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    largest = -1e10
8460c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    t0 = time.time()
8470c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    for i in range(n):
84862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger        x = func(*args)
849b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger        total += x
8500c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        sqsum = sqsum + x*x
8510c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        smallest = min(x, smallest)
8520c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        largest = max(x, largest)
8530c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    t1 = time.time()
8540c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    print round(t1-t0, 3), 'sec,',
855b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger    avg = total/n
856d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    stddev = _sqrt(sqsum/n - avg*avg)
8570c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    print 'avg %g, stddev %g, min %g, max %g' % \
8580c9886d589ddebf32de0ca3f027a173222ed383aTim Peters              (avg, stddev, smallest, largest)
859ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
860f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
861f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingerdef _test(N=2000):
86262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, random, ())
86362297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, normalvariate, (0.0, 1.0))
86462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, lognormvariate, (0.0, 1.0))
86562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, vonmisesvariate, (0.0, 1.0))
86662297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.01, 1.0))
86762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.1, 1.0))
86862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.1, 2.0))
86962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.5, 1.0))
87062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.9, 1.0))
87162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (1.0, 1.0))
87262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (2.0, 1.0))
87362297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (20.0, 1.0))
87462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (200.0, 1.0))
87562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gauss, (0.0, 1.0))
87662297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, betavariate, (3.0, 3.0))
877bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger    _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
878cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
879715c4c412b21f68ad59773698d06eea8eb0c5a44Tim Peters# Create one instance, seeded from current time, and export its methods
88040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# as module-level functions.  The functions share state across all uses
88140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger#(both in the user's code and in the Python libraries), but that's fine
88240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# for most programs and is easier for the casual user than making them
88340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# instantiate their own Random() instance.
88440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
885d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters_inst = Random()
886d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersseed = _inst.seed
887d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandom = _inst.random
888d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersuniform = _inst.uniform
889bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettingertriangular = _inst.triangular
890d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandint = _inst.randint
891d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterschoice = _inst.choice
892d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandrange = _inst.randrange
893f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingersample = _inst.sample
894d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersshuffle = _inst.shuffle
895d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersnormalvariate = _inst.normalvariate
896d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterslognormvariate = _inst.lognormvariate
897d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersexpovariate = _inst.expovariate
898d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersvonmisesvariate = _inst.vonmisesvariate
899d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgammavariate = _inst.gammavariate
900d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgauss = _inst.gauss
901d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersbetavariate = _inst.betavariate
902d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersparetovariate = _inst.paretovariate
903d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersweibullvariate = _inst.weibullvariate
904d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgetstate = _inst.getstate
905d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterssetstate = _inst.setstate
906d52269bfd029c4a517ea74c17edd5c3a250c366cTim Petersjumpahead = _inst.jumpahead
9072f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingergetrandbits = _inst.getrandbits
908d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
909ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumif __name__ == '__main__':
910d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    _test()
911