random.py revision f2eb2b44fc532c77c03bc95789817a20d7c558c3
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
49d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
50f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger__all__ = ["Random","seed","random","uniform","randint","choice","sample",
510de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro           "randrange","shuffle","normalvariate","lognormvariate",
52bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger           "expovariate","vonmisesvariate","gammavariate","triangular",
53f8a52d38ad784b34a60720cb148180d6eb6de373Raymond Hettinger           "gauss","betavariate","paretovariate","weibullvariate",
54356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger           "getstate","setstate","jumpahead", "WichmannHill", "getrandbits",
5523f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger           "SystemRandom"]
56ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
57d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersNV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
58d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersTWOPI = 2.0*_pi
59d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersLOG4 = _log(4.0)
60d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersSG_MAGICCONST = 1.0 + _log(4.5)
612f726e9093381572b21edbfc42659ea89fbdf686Raymond HettingerBPF = 53        # Number of bits in a float
627c2a85b2d44851c2442ade579b760f86447bf848Tim PetersRECIP_BPF = 2**-BPF
6333d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
64356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
65d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters# Translated by Guido van Rossum from C source provided by
6640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# Adrian Baddeley.  Adapted by Raymond Hettinger for use with
673fa19d7ff89be87139e2864fb9186b424d180a58Raymond Hettinger# the Mersenne Twister  and os.urandom() core generators.
6833d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
69145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettingerimport _random
7040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
71145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettingerclass Random(_random.Random):
72c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    """Random number generator base class used by bound module functions.
73c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
74c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    Used to instantiate instances of Random to get generators that don't
75c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    share state.  Especially useful for multi-threaded programs, creating
76c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    a different instance of Random for each thread, and using the jumpahead()
77c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    method to ensure that the generated sequences seen by each thread don't
78c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    overlap.
79c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
80c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    Class Random can also be subclassed if you want to use a different basic
81c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    generator of your own devising: in that case, override the following
82f2eb2b44fc532c77c03bc95789817a20d7c558c3Benjamin Peterson    methods: random(), seed(), getstate(), setstate() and jumpahead().
83f2eb2b44fc532c77c03bc95789817a20d7c558c3Benjamin Peterson    Optionally, implement a getrandbits() method so that randrange() can cover
84f2eb2b44fc532c77c03bc95789817a20d7c558c3Benjamin Peterson    arbitrarily large ranges.
85ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
86c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    """
8733d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
886b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis    VERSION = 3     # used by getstate/setstate
8933d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
90d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def __init__(self, x=None):
91d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Initialize an instance.
9233d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
93d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        Optional argument x controls seeding, as for Random.seed().
94d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
9533d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
96d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        self.seed(x)
9740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
98ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
990de88fc4b108751b86443852b6741680d704168fTim Peters    def seed(self, a=None):
1000de88fc4b108751b86443852b6741680d704168fTim Peters        """Initialize internal state from hashable object.
101d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
10223f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        None or no argument seeds from current time or from an operating
10323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        system specific randomness source if available.
1040de88fc4b108751b86443852b6741680d704168fTim Peters
105bcd725fc456faca13f4598f87c0517f917711cdaTim Peters        If a is not None or an int or long, hash(a) is used instead.
106d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
107d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
1083081d59f920229b26293c7a3ee3f1a9da0da53e9Raymond Hettinger        if a is None:
109c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            try:
110c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger                a = long(_hexlify(_urandom(16)), 16)
111c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            except NotImplementedError:
112356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                import time
113356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                a = long(time.time() * 256) # use fractional seconds
114356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
115145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger        super(Random, self).seed(a)
11646c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters        self.gauss_next = None
11746c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters
118d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def getstate(self):
119d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Return internal state; can be passed to setstate() later."""
120145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger        return self.VERSION, super(Random, self).getstate(), self.gauss_next
121d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
122d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def setstate(self, state):
123d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Restore internal state from object returned by getstate()."""
124d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        version = state[0]
1256b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis        if version == 3:
12640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            version, internalstate, self.gauss_next = state
127145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger            super(Random, self).setstate(internalstate)
1286b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis        elif version == 2:
1296b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            version, internalstate, self.gauss_next = state
1306b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            # In version 2, the state was saved as signed ints, which causes
1316b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   inconsistencies between 32/64-bit systems. The state is
1326b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   really unsigned 32-bit ints, so we convert negative ints from
1336b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   version 2 to positive longs for version 3.
1346b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            try:
1356b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis                internalstate = tuple( long(x) % (2**32) for x in internalstate )
1366b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            except ValueError, e:
1376b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis                raise TypeError, e
1386b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            super(Random, self).setstate(internalstate)
139d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
140d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError("state with version %s passed to "
141d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                             "Random.setstate() of version %s" %
142d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                             (version, self.VERSION))
143d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
144cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- Methods below this point do not need to be overridden when
145cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- subclassing for the purpose of using a different core generator.
146d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
147cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- pickle support  -------------------
148d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
149cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters    def __getstate__(self): # for pickle
150cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        return self.getstate()
151d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
152cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters    def __setstate__(self, state):  # for pickle
153cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        self.setstate(state)
154cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
1555f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger    def __reduce__(self):
1565f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger        return self.__class__, (), self.getstate()
1575f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger
158cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- integer methods  -------------------
159d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
1602f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger    def randrange(self, start, stop=None, step=1, int=int, default=None,
1612f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                  maxwidth=1L<<BPF):
162d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Choose a random item from range(start, stop[, step]).
163d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
164d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        This fixes the problem with randint() which includes the
165d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        endpoint; in Python this is usually not what you want.
1662f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        Do not supply the 'int', 'default', and 'maxwidth' arguments.
167d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
168d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
169d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # This code is a bit messy to make it fast for the
1709146f27b7799dab231083f194a14c6157b57549fTim Peters        # common case while still doing adequate error checking.
171d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        istart = int(start)
172d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istart != start:
173d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer arg 1 for randrange()"
174d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if stop is default:
175d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            if istart > 0:
1762f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                if istart >= maxwidth:
1772f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                    return self._randbelow(istart)
178d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                return int(self.random() * istart)
179d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "empty range for randrange()"
1809146f27b7799dab231083f194a14c6157b57549fTim Peters
1819146f27b7799dab231083f194a14c6157b57549fTim Peters        # stop argument supplied.
182d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        istop = int(stop)
183d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istop != stop:
184d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer stop for randrange()"
1852f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        width = istop - istart
1862f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if step == 1 and width > 0:
18776ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # Note that
1882f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            #     int(istart + self.random()*width)
18976ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # instead would be incorrect.  For example, consider istart
19076ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # = -2 and istop = 0.  Then the guts would be in
19176ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # -2.0 to 0.0 exclusive on both ends (ignoring that random()
19276ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # might return 0.0), and because int() truncates toward 0, the
19376ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # final result would be -1 or 0 (instead of -2 or -1).
1942f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            #     istart + int(self.random()*width)
19576ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # would also be incorrect, for a subtler reason:  the RHS
19676ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # can return a long, and then randrange() would also return
19776ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # a long, but we're supposed to return an int (for backward
19876ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # compatibility).
1992f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2002f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            if width >= maxwidth:
20158eb11cf62dd04ccc2c364b62fd51b4265e2e203Tim Peters                return int(istart + self._randbelow(width))
2022f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            return int(istart + int(self.random()*width))
203d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if step == 1:
2042f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width)
2059146f27b7799dab231083f194a14c6157b57549fTim Peters
2069146f27b7799dab231083f194a14c6157b57549fTim Peters        # Non-unit step argument supplied.
207d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        istep = int(step)
208d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istep != step:
209d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer step for randrange()"
210d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istep > 0:
211ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger            n = (width + istep - 1) // istep
212d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        elif istep < 0:
213ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger            n = (width + istep + 1) // istep
214d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
215d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "zero step for randrange()"
216d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
217d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if n <= 0:
218d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "empty range for randrange()"
2192f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2202f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if n >= maxwidth:
22194547f7646895e032f8fc145529d9efc3a70760dRaymond Hettinger            return istart + istep*self._randbelow(n)
222d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return istart + istep*int(self.random() * n)
223d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
224d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def randint(self, a, b):
225cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        """Return random integer in range [a, b], including both end points.
226d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
227d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
228d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return self.randrange(a, b+1)
229d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
2302f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger    def _randbelow(self, n, _log=_log, int=int, _maxwidth=1L<<BPF,
2312f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                   _Method=_MethodType, _BuiltinMethod=_BuiltinMethodType):
2322f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        """Return a random int in the range [0,n)
2332f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2342f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        Handles the case where n has more bits than returned
2352f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        by a single call to the underlying generator.
2362f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        """
2372f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2382f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        try:
2392f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            getrandbits = self.getrandbits
2402f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        except AttributeError:
2412f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            pass
2422f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        else:
2432f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # Only call self.getrandbits if the original random() builtin method
2442f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # has not been overridden or if a new getrandbits() was supplied.
2452f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # This assures that the two methods correspond.
2462f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            if type(self.random) is _BuiltinMethod or type(getrandbits) is _Method:
2472f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                k = int(1.00001 + _log(n-1, 2.0))   # 2**k > n-1 > 2**(k-2)
2482f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                r = getrandbits(k)
2492f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                while r >= n:
2502f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                    r = getrandbits(k)
2512f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                return r
2522f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if n >= _maxwidth:
2532f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            _warn("Underlying random() generator does not supply \n"
2542f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                "enough bits to choose from a population range this large")
2552f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        return int(self.random() * n)
2562f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
257cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- sequence methods  -------------------
258cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
259d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def choice(self, seq):
260d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Choose a random element from a non-empty sequence."""
2615dae505bbd59641a948c81bea981e7c44d4c2343Raymond Hettinger        return seq[int(self.random() * len(seq))]  # raises IndexError if seq is empty
262d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
263d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def shuffle(self, x, random=None, int=int):
264d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """x, random=random.random -> shuffle list x in place; return None.
265d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
266d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        Optional arg random is a 0-argument function returning a random
267d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        float in [0.0, 1.0); by default, the standard random.random.
268d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
269d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
270d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if random is None:
271d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            random = self.random
27285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger        for i in reversed(xrange(1, len(x))):
273cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters            # pick an element in x[:i+1] with which to exchange x[i]
274d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            j = int(random() * (i+1))
275d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            x[i], x[j] = x[j], x[i]
276d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
277fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger    def sample(self, population, k):
278f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        """Chooses k unique random elements from a population sequence.
279f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
280c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        Returns a new list containing elements from the population while
281c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        leaving the original population unchanged.  The resulting list is
282c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        in selection order so that all sub-slices will also be valid random
283c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        samples.  This allows raffle winners (the sample) to be partitioned
284c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        into grand prize and second place winners (the subslices).
285f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
286c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        Members of the population need not be hashable or unique.  If the
287c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        population contains repeats, then each occurrence is a possible
288c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        selection in the sample.
289f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
290c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        To choose a sample in a range of integers, use xrange as an argument.
291c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        This is especially fast and space efficient for sampling from a
292c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        large population:   sample(xrange(10000000), 60)
293f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        """
294f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
295c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX Although the documentation says `population` is "a sequence",
296c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX attempts are made to cater to any iterable with a __len__
297c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX method.  This has had mixed success.  Examples from both
298c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX sides:  sets work fine, and should become officially supported;
299c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX dicts are much harder, and have failed in various subtle
300c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX ways across attempts.  Support for mapping types should probably
301c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX be dropped (and users should pass mapping.keys() or .values()
302c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX explicitly).
303c17976e9833f3093adb1019356737e728a24f7c9Tim Peters
304c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        # Sampling without replacement entails tracking either potential
30591e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # selections (the pool) in a list or previous selections in a set.
306c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger
3072b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # When the number of selections is small compared to the
3082b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # population, then tracking selections is efficient, requiring
30991e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # only a small set and an occasional reselection.  For
3102b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # a larger number of selections, the pool tracking method is
3112b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # preferred since the list takes less space than the
31291e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # set and it doesn't suffer from frequent reselections.
313c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger
314f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        n = len(population)
315f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        if not 0 <= k <= n:
316f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger            raise ValueError, "sample larger than population"
3178b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger        random = self.random
318fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger        _int = int
319c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        result = [None] * k
32091e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        setsize = 21        # size of a small set minus size of an empty list
32191e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        if k > 5:
3229e34c047325651853a95f95e538582a4f6d5b7f6Tim Peters            setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
323c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        if n <= setsize or hasattr(population, "keys"):
324c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            # An n-length list is smaller than a k-length set, or this is a
325c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            # mapping type so the other algorithm wouldn't work.
326311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger            pool = list(population)
327311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger            for i in xrange(k):         # invariant:  non-selected at [0,n-i)
328fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger                j = _int(random() * (n-i))
329311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger                result[i] = pool[j]
3308b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger                pool[j] = pool[n-i-1]   # move non-selected item into vacancy
331c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        else:
33266d09f1b3029d9cf975ccf26c437c9fb2605db91Raymond Hettinger            try:
3333c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                selected = set()
3343c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                selected_add = selected.add
3353c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                for i in xrange(k):
336fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger                    j = _int(random() * n)
3373c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    while j in selected:
3383c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                        j = _int(random() * n)
3393c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    selected_add(j)
3403c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    result[i] = population[j]
341c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            except (TypeError, KeyError):   # handle (at least) sets
3423c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                if isinstance(population, list):
3433c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    raise
344c17976e9833f3093adb1019356737e728a24f7c9Tim Peters                return self.sample(tuple(population), k)
345311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger        return result
346f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
347cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- real-valued distributions  -------------------
348cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
349cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- uniform distribution -------------------
350d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
351d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def uniform(self, a, b):
352d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Get a random number in the range [a, b)."""
353d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return a + (b-a) * self.random()
354ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
355bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger## -------------------- triangular --------------------
356bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
357c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger    def triangular(self, low=0.0, high=1.0, mode=None):
358bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        """Triangular distribution.
359bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
360bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        Continuous distribution bounded by given lower and upper limits,
361bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        and having a given mode value in-between.
362bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
363bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        http://en.wikipedia.org/wiki/Triangular_distribution
364bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
365bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        """
366bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        u = self.random()
367c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger        c = 0.5 if mode is None else (mode - low) / (high - low)
368bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        if u > c:
369c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger            u = 1.0 - u
370c4f7bab0a0cd208bcab3c4f6cd8324ed8d08f98eRaymond Hettinger            c = 1.0 - c
371bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger            low, high = high, low
372bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger        return low + (high - low) * (u * c) ** 0.5
373bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger
374cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- normal distribution --------------------
375ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
376d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def normalvariate(self, mu, sigma):
377c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Normal distribution.
378c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
379c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean, and sigma is the standard deviation.
380ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
381c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
382d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # mu = mean, sigma = standard deviation
383d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
384d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Uses Kinderman and Monahan method. Reference: Kinderman,
385d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # A.J. and Monahan, J.F., "Computer generation of random
386d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # variables using the ratio of uniform deviates", ACM Trans
387d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Math Software, 3, (1977), pp257-260.
388d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
389d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
39042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger        while 1:
391d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u1 = random()
39273ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger            u2 = 1.0 - random()
393d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = NV_MAGICCONST*(u1-0.5)/u2
394d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            zz = z*z/4.0
395d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            if zz <= -_log(u2):
396d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                break
397d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return mu + z*sigma
398ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
399cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- lognormal distribution --------------------
400ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
401d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def lognormvariate(self, mu, sigma):
402c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Log normal distribution.
403c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
404c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        If you take the natural logarithm of this distribution, you'll get a
405c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        normal distribution with mean mu and standard deviation sigma.
406c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu can have any value, and sigma must be greater than zero.
407ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
408c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
409d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return _exp(self.normalvariate(mu, sigma))
410ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
411cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- exponential distribution --------------------
412ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
413d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def expovariate(self, lambd):
414c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Exponential distribution.
415c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
416c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        lambd is 1.0 divided by the desired mean.  (The parameter would be
417c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        called "lambda", but that is a reserved word in Python.)  Returned
418c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        values range from 0 to positive infinity.
419ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
420c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
421d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # lambd: rate lambd = 1/mean
422d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # ('lambda' is a Python reserved word)
423ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
424d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
4250c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        u = random()
426d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        while u <= 1e-7:
427d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u = random()
428d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return -_log(u)/lambd
429ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
430cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- von Mises distribution --------------------
431ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
432d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def vonmisesvariate(self, mu, kappa):
433c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Circular data distribution.
434ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
435c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean angle, expressed in radians between 0 and 2*pi, and
436c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        kappa is the concentration parameter, which must be greater than or
437c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        equal to zero.  If kappa is equal to zero, this distribution reduces
438c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        to a uniform random angle over the range 0 to 2*pi.
439ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
440c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
441d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # mu:    mean angle (in radians between 0 and 2*pi)
442d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # kappa: concentration parameter kappa (>= 0)
443d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # if kappa = 0 generate uniform random angle
4445810297052003f28788f6790ac799fe8e5373494Guido van Rossum
445d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Based upon an algorithm published in: Fisher, N.I.,
446d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # "Statistical Analysis of Circular Data", Cambridge
447d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # University Press, 1993.
4485810297052003f28788f6790ac799fe8e5373494Guido van Rossum
449d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Thanks to Magnus Kessler for a correction to the
450d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # implementation of step 4.
4515810297052003f28788f6790ac799fe8e5373494Guido van Rossum
452d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
453d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if kappa <= 1e-6:
454d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            return TWOPI * random()
455ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
456d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa)
457d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        b = (a - _sqrt(2.0 * a))/(2.0 * kappa)
458d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        r = (1.0 + b * b)/(2.0 * b)
459ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
46042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger        while 1:
461d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u1 = random()
462ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
463d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = _cos(_pi * u1)
464d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            f = (1.0 + r * z)/(r + z)
465d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            c = kappa * (r - f)
466ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
467d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u2 = random()
468ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
46942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c):
470d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                break
471ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
472d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        u3 = random()
473d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if u3 > 0.5:
474d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            theta = (mu % TWOPI) + _acos(f)
475d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
476d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            theta = (mu % TWOPI) - _acos(f)
477ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
478d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return theta
479ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
480cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- gamma distribution --------------------
481ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
482d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def gammavariate(self, alpha, beta):
483c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Gamma distribution.  Not the gamma function!
484c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
485c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Conditions on the parameters are alpha > 0 and beta > 0.
486c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
487c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
4888ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
489b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger        # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
4908ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
491570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        # Warning: a few older sources define the gamma distribution in terms
492570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        # of alpha > -1.0
493570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        if alpha <= 0.0 or beta <= 0.0:
494570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum            raise ValueError, 'gammavariate: alpha and beta must be > 0.0'
4958ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
496d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
497d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if alpha > 1.0:
498d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
499d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Uses R.C.H. Cheng, "The generation of Gamma
500d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # variables with non-integral shape parameters",
501d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Applied Statistics, (1977), 26, No. 1, p71-74
502d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
503ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            ainv = _sqrt(2.0 * alpha - 1.0)
504ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            bbb = alpha - LOG4
505ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            ccc = alpha + ainv
5068ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
50742406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            while 1:
508d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u1 = random()
50973ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                if not 1e-7 < u1 < .9999999:
51073ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                    continue
51173ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                u2 = 1.0 - random()
512d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                v = _log(u1/(1.0-u1))/ainv
513d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                x = alpha*_exp(v)
514d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                z = u1*u1*u2
515d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                r = bbb+ccc*v-x
516d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
517b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger                    return x * beta
518d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
519d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        elif alpha == 1.0:
520d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # expovariate(1)
5210c9886d589ddebf32de0ca3f027a173222ed383aTim Peters            u = random()
522d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            while u <= 1e-7:
523d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u = random()
524b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger            return -_log(u) * beta
525d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
526d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:   # alpha is between 0 and 1 (exclusive)
527d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
528d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
529d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
53042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            while 1:
531d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u = random()
532d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                b = (_e + alpha)/_e
533d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                p = b*u
534d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                if p <= 1.0:
53542406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                    x = p ** (1.0/alpha)
536d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                else:
537d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                    x = -_log((b-p)/alpha)
538d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u1 = random()
53942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                if p > 1.0:
54042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                    if u1 <= x ** (alpha - 1.0):
54142406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                        break
54242406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                elif u1 <= _exp(-x):
543d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                    break
544b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger            return x * beta
545b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger
546cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Gauss (faster alternative) --------------------
54795bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
548d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def gauss(self, mu, sigma):
549c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Gaussian distribution.
550c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
551c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean, and sigma is the standard deviation.  This is
552c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        slightly faster than the normalvariate() function.
553c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
554c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Not thread-safe without a lock around calls.
555ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
556c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
557d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
558d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # When x and y are two variables from [0, 1), uniformly
559d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # distributed, then
560d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #
561d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #    cos(2*pi*x)*sqrt(-2*log(1-y))
562d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #    sin(2*pi*x)*sqrt(-2*log(1-y))
563d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #
564d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # are two *independent* variables with normal distribution
565d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (mu = 0, sigma = 1).
566d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (Lambert Meertens)
567d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (corrected version; bug discovered by Mike Miller, fixed by LM)
568d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
569d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Multithreading note: When two threads call this function
570d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # simultaneously, it is possible that they will receive the
571d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # same return value.  The window is very small though.  To
572d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # avoid this, you have to use a lock around all calls.  (I
573d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # didn't want to slow this down in the serial case by using a
574d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # lock here.)
575d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
576d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
577d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        z = self.gauss_next
578d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        self.gauss_next = None
579d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if z is None:
580d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            x2pi = random() * TWOPI
581d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            g2rad = _sqrt(-2.0 * _log(1.0 - random()))
582d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = _cos(x2pi) * g2rad
583d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            self.gauss_next = _sin(x2pi) * g2rad
584d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
585d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return mu + z*sigma
58695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
587cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- beta --------------------
58885e2e4742d0a1accecd02058a7907df36308297eTim Peters## See
58985e2e4742d0a1accecd02058a7907df36308297eTim Peters## http://sourceforge.net/bugs/?func=detailbug&bug_id=130030&group_id=5470
59085e2e4742d0a1accecd02058a7907df36308297eTim Peters## for Ivan Frohne's insightful analysis of why the original implementation:
59185e2e4742d0a1accecd02058a7907df36308297eTim Peters##
59285e2e4742d0a1accecd02058a7907df36308297eTim Peters##    def betavariate(self, alpha, beta):
59385e2e4742d0a1accecd02058a7907df36308297eTim Peters##        # Discrete Event Simulation in C, pp 87-88.
59485e2e4742d0a1accecd02058a7907df36308297eTim Peters##
59585e2e4742d0a1accecd02058a7907df36308297eTim Peters##        y = self.expovariate(alpha)
59685e2e4742d0a1accecd02058a7907df36308297eTim Peters##        z = self.expovariate(1.0/beta)
59785e2e4742d0a1accecd02058a7907df36308297eTim Peters##        return z/(y+z)
59885e2e4742d0a1accecd02058a7907df36308297eTim Peters##
59985e2e4742d0a1accecd02058a7907df36308297eTim Peters## was dead wrong, and how it probably got that way.
60095bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
601d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def betavariate(self, alpha, beta):
602c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Beta distribution.
603c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
6041b0ce8527112b997194a4e2fb9a1a850c6d73ee8Raymond Hettinger        Conditions on the parameters are alpha > 0 and beta > 0.
605c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Returned values range between 0 and 1.
606ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
607c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
608ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
60985e2e4742d0a1accecd02058a7907df36308297eTim Peters        # This version due to Janne Sinkkonen, and matches all the std
61085e2e4742d0a1accecd02058a7907df36308297eTim Peters        # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
61185e2e4742d0a1accecd02058a7907df36308297eTim Peters        y = self.gammavariate(alpha, 1.)
61285e2e4742d0a1accecd02058a7907df36308297eTim Peters        if y == 0:
61385e2e4742d0a1accecd02058a7907df36308297eTim Peters            return 0.0
61485e2e4742d0a1accecd02058a7907df36308297eTim Peters        else:
61585e2e4742d0a1accecd02058a7907df36308297eTim Peters            return y / (y + self.gammavariate(beta, 1.))
61695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
617cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Pareto --------------------
618cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
619d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def paretovariate(self, alpha):
620c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Pareto distribution.  alpha is the shape parameter."""
621d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Jain, pg. 495
622cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
62373ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger        u = 1.0 - self.random()
624d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return 1.0 / pow(u, 1.0/alpha)
625cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
626cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Weibull --------------------
627cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
628d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def weibullvariate(self, alpha, beta):
629c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Weibull distribution.
630c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
631c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        alpha is the scale parameter and beta is the shape parameter.
632ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
633c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
634d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Jain, pg. 499; bug fix courtesy Bill Arms
635cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
63673ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger        u = 1.0 - self.random()
637d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return alpha * pow(-_log(u), 1.0/beta)
6386c395ba31609eeffce2428280cc5d95e4fb8058aGuido van Rossum
63940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger## -------------------- Wichmann-Hill -------------------
64040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
64140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettingerclass WichmannHill(Random):
64240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
64340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    VERSION = 1     # used by getstate/setstate
64440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
64540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def seed(self, a=None):
64640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Initialize internal state from hashable object.
64740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
64823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        None or no argument seeds from current time or from an operating
64923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        system specific randomness source if available.
65040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        If a is not None or an int or long, hash(a) is used instead.
65240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        If a is an int or long, a is used directly.  Distinct values between
65440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        0 and 27814431486575L inclusive are guaranteed to yield distinct
65540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        internal states (this guarantee is specific to the default
65640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Wichmann-Hill generator).
65740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
65840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if a is None:
660c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            try:
661c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger                a = long(_hexlify(_urandom(16)), 16)
662c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            except NotImplementedError:
663356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                import time
664356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                a = long(time.time() * 256) # use fractional seconds
66540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
66640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not isinstance(a, (int, long)):
66740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            a = hash(a)
66840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
66940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, x = divmod(a, 30268)
67040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, y = divmod(a, 30306)
67140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, z = divmod(a, 30322)
67240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = int(x)+1, int(y)+1, int(z)+1
67340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
67440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
67540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
67640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def random(self):
67740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Get the next random number in the range [0.0, 1.0)."""
67840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
67940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Wichman-Hill random number generator.
68040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
68140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Wichmann, B. A. & Hill, I. D. (1982)
68240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Algorithm AS 183:
68340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # An efficient and portable pseudo-random number generator
68440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Applied Statistics 31 (1982) 188-190
68540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
68640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # see also:
68740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Correction to Algorithm AS 183
68840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Applied Statistics 33 (1984) 123
68940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
69040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        McLeod, A. I. (1985)
69140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        A remark on Algorithm AS 183
69240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Applied Statistics 34 (1985),198-200
69340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
69440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # This part is thread-unsafe:
69540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # BEGIN CRITICAL SECTION
69640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x, y, z = self._seed
69740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = (171 * x) % 30269
69840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = (172 * y) % 30307
69940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = (170 * z) % 30323
70040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = x, y, z
70140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # END CRITICAL SECTION
70240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
70340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Note:  on a platform using IEEE-754 double arithmetic, this can
70440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # never return 0.0 (asserted by Tim; proof too long for a comment).
70540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
70640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
70740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def getstate(self):
70840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Return internal state; can be passed to setstate() later."""
70940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        return self.VERSION, self._seed, self.gauss_next
71040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
71140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def setstate(self, state):
71240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Restore internal state from object returned by getstate()."""
71340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        version = state[0]
71440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if version == 1:
71540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            version, self._seed, self.gauss_next = state
71640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        else:
71740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError("state with version %s passed to "
71840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger                             "Random.setstate() of version %s" %
71940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger                             (version, self.VERSION))
72040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def jumpahead(self, n):
72240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Act as if n calls to random() were made, but quickly.
72340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        n is an int, greater than or equal to 0.
72540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Example use:  If you have 2 threads and know that each will
72740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        consume no more than a million random numbers, create two Random
72840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        objects r1 and r2, then do
72940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            r2.setstate(r1.getstate())
73040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            r2.jumpahead(1000000)
73140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Then r1 and r2 will use guaranteed-disjoint segments of the full
73240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        period.
73340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
73440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
73540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not n >= 0:
73640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError("n must be >= 0")
73740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x, y, z = self._seed
73840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = int(x * pow(171, n, 30269)) % 30269
73940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = int(y * pow(172, n, 30307)) % 30307
74040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = int(z * pow(170, n, 30323)) % 30323
74140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = x, y, z
74240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def __whseed(self, x=0, y=0, z=0):
74440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Set the Wichmann-Hill seed from (x, y, z).
74540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        These must be integers in the range [0, 256).
74740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
74840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not type(x) == type(y) == type(z) == int:
75040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise TypeError('seeds must be integers')
75140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256):
75240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError('seeds must be in range(0, 256)')
75340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if 0 == x == y == z:
75440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            # Initialize from current time
75540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            import time
75640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t = long(time.time() * 256)
75740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t = int((t&0xffffff) ^ (t>>24))
75840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, x = divmod(t, 256)
75940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, y = divmod(t, 256)
76040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, z = divmod(t, 256)
76140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Zero is a poor seed, so substitute 1
76240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = (x or 1, y or 1, z or 1)
76340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
76440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
76540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
76640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def whseed(self, a=None):
76740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Seed from hashable object's hash code.
76840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
76940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        None or no argument seeds from current time.  It is not guaranteed
77040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        that objects with distinct hash codes lead to distinct internal
77140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        states.
77240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
77340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        This is obsolete, provided for compatibility with the seed routine
77440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        used prior to Python 2.1.  Use the .seed() method instead.
77540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
77640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
77740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if a is None:
77840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            self.__whseed()
77940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            return
78040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a = hash(a)
78140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, x = divmod(a, 256)
78240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, y = divmod(a, 256)
78340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, z = divmod(a, 256)
78440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = (x + a) % 256 or 1
78540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = (y + a) % 256 or 1
78640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = (z + a) % 256 or 1
78740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.__whseed(x, y, z)
78840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
78923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger## --------------- Operating System Random Source  ------------------
790356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
79123f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettingerclass SystemRandom(Random):
79223f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    """Alternate random number generator using sources provided
79323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    by the operating system (such as /dev/urandom on Unix or
79423f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    CryptGenRandom on Windows).
795356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
796356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger     Not available on all systems (see os.urandom() for details).
797356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    """
798356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
799356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def random(self):
800356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        """Get the next random number in the range [0.0, 1.0)."""
8017c2a85b2d44851c2442ade579b760f86447bf848Tim Peters        return (long(_hexlify(_urandom(7)), 16) >> 3) * RECIP_BPF
802356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
803356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def getrandbits(self, k):
804356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        """getrandbits(k) -> x.  Generates a long int with k random bits."""
805356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        if k <= 0:
806356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger            raise ValueError('number of bits must be greater than zero')
807356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        if k != int(k):
808356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger            raise TypeError('number of bits should be an integer')
809356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        bytes = (k + 7) // 8                    # bits / 8 and rounded up
810356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        x = long(_hexlify(_urandom(bytes)), 16)
811356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        return x >> (bytes * 8 - k)             # trim excess bits
812356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
813356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def _stub(self, *args, **kwds):
81423f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        "Stub method.  Not used for a system random number generator."
815356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        return None
816356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    seed = jumpahead = _stub
817356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
818356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def _notimplemented(self, *args, **kwds):
81923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        "Method should not be called for a system random number generator."
82023f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        raise NotImplementedError('System entropy source does not have state.')
821356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    getstate = setstate = _notimplemented
822356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
823cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- test program --------------------
824ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
82562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettingerdef _test_generator(n, func, args):
8260c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    import time
82762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    print n, 'times', func.__name__
828b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger    total = 0.0
8290c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    sqsum = 0.0
8300c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    smallest = 1e10
8310c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    largest = -1e10
8320c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    t0 = time.time()
8330c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    for i in range(n):
83462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger        x = func(*args)
835b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger        total += x
8360c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        sqsum = sqsum + x*x
8370c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        smallest = min(x, smallest)
8380c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        largest = max(x, largest)
8390c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    t1 = time.time()
8400c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    print round(t1-t0, 3), 'sec,',
841b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger    avg = total/n
842d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    stddev = _sqrt(sqsum/n - avg*avg)
8430c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    print 'avg %g, stddev %g, min %g, max %g' % \
8440c9886d589ddebf32de0ca3f027a173222ed383aTim Peters              (avg, stddev, smallest, largest)
845ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
846f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
847f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingerdef _test(N=2000):
84862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, random, ())
84962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, normalvariate, (0.0, 1.0))
85062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, lognormvariate, (0.0, 1.0))
85162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, vonmisesvariate, (0.0, 1.0))
85262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.01, 1.0))
85362297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.1, 1.0))
85462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.1, 2.0))
85562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.5, 1.0))
85662297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.9, 1.0))
85762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (1.0, 1.0))
85862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (2.0, 1.0))
85962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (20.0, 1.0))
86062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (200.0, 1.0))
86162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gauss, (0.0, 1.0))
86262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, betavariate, (3.0, 3.0))
863bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettinger    _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0))
864cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
865715c4c412b21f68ad59773698d06eea8eb0c5a44Tim Peters# Create one instance, seeded from current time, and export its methods
86640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# as module-level functions.  The functions share state across all uses
86740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger#(both in the user's code and in the Python libraries), but that's fine
86840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# for most programs and is easier for the casual user than making them
86940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# instantiate their own Random() instance.
87040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
871d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters_inst = Random()
872d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersseed = _inst.seed
873d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandom = _inst.random
874d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersuniform = _inst.uniform
875bbc50eafe5cc7d2fa73b5b45eebc573c600db9acRaymond Hettingertriangular = _inst.triangular
876d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandint = _inst.randint
877d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterschoice = _inst.choice
878d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandrange = _inst.randrange
879f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingersample = _inst.sample
880d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersshuffle = _inst.shuffle
881d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersnormalvariate = _inst.normalvariate
882d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterslognormvariate = _inst.lognormvariate
883d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersexpovariate = _inst.expovariate
884d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersvonmisesvariate = _inst.vonmisesvariate
885d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgammavariate = _inst.gammavariate
886d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgauss = _inst.gauss
887d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersbetavariate = _inst.betavariate
888d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersparetovariate = _inst.paretovariate
889d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersweibullvariate = _inst.weibullvariate
890d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgetstate = _inst.getstate
891d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterssetstate = _inst.setstate
892d52269bfd029c4a517ea74c17edd5c3a250c366cTim Petersjumpahead = _inst.jumpahead
8932f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingergetrandbits = _inst.getrandbits
894d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
895ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumif __name__ == '__main__':
896d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    _test()
897