random.py revision 6b449f4f2bd86c104a8b57547428eb9bb3a182b0
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
16e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           normal (Gaussian)
17e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           lognormal
18e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           negative exponential
19e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           gamma
20e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           beta
2140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger           pareto
2240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger           Weibull
23e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum
24e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum    distributions on the circle (angles 0 to 2pi)
25e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum    ---------------------------------------------
26e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           circular uniform
27e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum           von Mises
28e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum
2940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond HettingerGeneral notes on the underlying Mersenne Twister core generator:
3040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
3140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger* The period is 2**19937-1.
320e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters* It is one of the most extensively tested generators in existence.
330e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters* Without a direct way to compute N steps forward, the semantics of
340e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters  jumpahead(n) are weakened to simply jump to another distant state and rely
350e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters  on the large period to avoid overlapping sequences.
360e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters* The random() method is implemented in C, executes in a single Python step,
370e1159583c06fdf85d7d2dbe8b82e42565b9d166Tim Peters  and is, therefore, threadsafe.
3840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
39e7b146fb3bdca62a0d5ecc06dbf3348e5a4fe757Guido van Rossum"""
40d03e1197cb5052e3f758794e2a7aecf9f5ca5f46Guido van Rossum
412f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingerfrom warnings import warn as _warn
422f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingerfrom types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
4391e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettingerfrom math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
44d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersfrom math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
45c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettingerfrom os import urandom as _urandom
46c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettingerfrom binascii import hexlify as _hexlify
47d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
48f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger__all__ = ["Random","seed","random","uniform","randint","choice","sample",
490de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro           "randrange","shuffle","normalvariate","lognormvariate",
50f8a52d38ad784b34a60720cb148180d6eb6de373Raymond Hettinger           "expovariate","vonmisesvariate","gammavariate",
51f8a52d38ad784b34a60720cb148180d6eb6de373Raymond Hettinger           "gauss","betavariate","paretovariate","weibullvariate",
52356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger           "getstate","setstate","jumpahead", "WichmannHill", "getrandbits",
5323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger           "SystemRandom"]
54ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
55d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersNV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
56d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersTWOPI = 2.0*_pi
57d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersLOG4 = _log(4.0)
58d7b5e88e8e40b77813ceb25dc28b87d672538403Tim PetersSG_MAGICCONST = 1.0 + _log(4.5)
592f726e9093381572b21edbfc42659ea89fbdf686Raymond HettingerBPF = 53        # Number of bits in a float
607c2a85b2d44851c2442ade579b760f86447bf848Tim PetersRECIP_BPF = 2**-BPF
6133d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
62356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
63d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters# Translated by Guido van Rossum from C source provided by
6440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# Adrian Baddeley.  Adapted by Raymond Hettinger for use with
653fa19d7ff89be87139e2864fb9186b424d180a58Raymond Hettinger# the Mersenne Twister  and os.urandom() core generators.
6633d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
67145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettingerimport _random
6840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
69145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettingerclass Random(_random.Random):
70c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    """Random number generator base class used by bound module functions.
71c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
72c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    Used to instantiate instances of Random to get generators that don't
73c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    share state.  Especially useful for multi-threaded programs, creating
74c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    a different instance of Random for each thread, and using the jumpahead()
75c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    method to ensure that the generated sequences seen by each thread don't
76c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    overlap.
77c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
78c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    Class Random can also be subclassed if you want to use a different basic
79c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    generator of your own devising: in that case, override the following
80c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    methods:  random(), seed(), getstate(), setstate() and jumpahead().
812f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger    Optionally, implement a getrandombits() method so that randrange()
822f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger    can cover arbitrarily large ranges.
83ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
84c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger    """
8533d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
866b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis    VERSION = 3     # used by getstate/setstate
8733d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
88d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def __init__(self, x=None):
89d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Initialize an instance.
9033d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
91d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        Optional argument x controls seeding, as for Random.seed().
92d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
9333d7f1a76c3544d2901492cfb6fc9db85f2dfbd6Guido van Rossum
94d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        self.seed(x)
9540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
96ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
970de88fc4b108751b86443852b6741680d704168fTim Peters    def seed(self, a=None):
980de88fc4b108751b86443852b6741680d704168fTim Peters        """Initialize internal state from hashable object.
99d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
10023f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        None or no argument seeds from current time or from an operating
10123f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        system specific randomness source if available.
1020de88fc4b108751b86443852b6741680d704168fTim Peters
103bcd725fc456faca13f4598f87c0517f917711cdaTim Peters        If a is not None or an int or long, hash(a) is used instead.
104d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
105d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
1063081d59f920229b26293c7a3ee3f1a9da0da53e9Raymond Hettinger        if a is None:
107c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            try:
108c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger                a = long(_hexlify(_urandom(16)), 16)
109c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            except NotImplementedError:
110356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                import time
111356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                a = long(time.time() * 256) # use fractional seconds
112356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
113145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger        super(Random, self).seed(a)
11446c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters        self.gauss_next = None
11546c04e140cf26d1b44935c28c6f15ea467400d22Tim Peters
116d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def getstate(self):
117d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Return internal state; can be passed to setstate() later."""
118145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger        return self.VERSION, super(Random, self).getstate(), self.gauss_next
119d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
120d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def setstate(self, state):
121d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Restore internal state from object returned by getstate()."""
122d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        version = state[0]
1236b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis        if version == 3:
12440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            version, internalstate, self.gauss_next = state
125145a4a0f10009f7ce2644465ccd359938b034ac4Raymond Hettinger            super(Random, self).setstate(internalstate)
1266b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis        elif version == 2:
1276b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            version, internalstate, self.gauss_next = state
1286b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            # In version 2, the state was saved as signed ints, which causes
1296b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   inconsistencies between 32/64-bit systems. The state is
1306b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   really unsigned 32-bit ints, so we convert negative ints from
1316b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            #   version 2 to positive longs for version 3.
1326b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            try:
1336b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis                internalstate = tuple( long(x) % (2**32) for x in internalstate )
1346b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            except ValueError, e:
1356b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis                raise TypeError, e
1366b449f4f2bd86c104a8b57547428eb9bb3a182b0Martin v. Löwis            super(Random, self).setstate(internalstate)
137d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
138d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError("state with version %s passed to "
139d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                             "Random.setstate() of version %s" %
140d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                             (version, self.VERSION))
141d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
142cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- Methods below this point do not need to be overridden when
143cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## ---- subclassing for the purpose of using a different core generator.
144d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
145cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- pickle support  -------------------
146d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
147cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters    def __getstate__(self): # for pickle
148cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        return self.getstate()
149d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
150cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters    def __setstate__(self, state):  # for pickle
151cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        self.setstate(state)
152cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
1535f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger    def __reduce__(self):
1545f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger        return self.__class__, (), self.getstate()
1555f078ff7f0c6bb5086fae077379fc79729c34d2dRaymond Hettinger
156cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- integer methods  -------------------
157d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
1582f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger    def randrange(self, start, stop=None, step=1, int=int, default=None,
1592f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                  maxwidth=1L<<BPF):
160d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Choose a random item from range(start, stop[, step]).
161d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
162d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        This fixes the problem with randint() which includes the
163d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        endpoint; in Python this is usually not what you want.
1642f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        Do not supply the 'int', 'default', and 'maxwidth' arguments.
165d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
166d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
167d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # This code is a bit messy to make it fast for the
1689146f27b7799dab231083f194a14c6157b57549fTim Peters        # common case while still doing adequate error checking.
169d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        istart = int(start)
170d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istart != start:
171d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer arg 1 for randrange()"
172d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if stop is default:
173d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            if istart > 0:
1742f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                if istart >= maxwidth:
1752f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                    return self._randbelow(istart)
176d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                return int(self.random() * istart)
177d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "empty range for randrange()"
1789146f27b7799dab231083f194a14c6157b57549fTim Peters
1799146f27b7799dab231083f194a14c6157b57549fTim Peters        # stop argument supplied.
180d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        istop = int(stop)
181d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istop != stop:
182d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer stop for randrange()"
1832f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        width = istop - istart
1842f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if step == 1 and width > 0:
18576ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # Note that
1862f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            #     int(istart + self.random()*width)
18776ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # instead would be incorrect.  For example, consider istart
18876ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # = -2 and istop = 0.  Then the guts would be in
18976ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # -2.0 to 0.0 exclusive on both ends (ignoring that random()
19076ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # might return 0.0), and because int() truncates toward 0, the
19176ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # final result would be -1 or 0 (instead of -2 or -1).
1922f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            #     istart + int(self.random()*width)
19376ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # would also be incorrect, for a subtler reason:  the RHS
19476ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # can return a long, and then randrange() would also return
19576ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # a long, but we're supposed to return an int (for backward
19676ca1d428f96284ed58f4523b698ed95c6fdbdb2Tim Peters            # compatibility).
1972f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
1982f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            if width >= maxwidth:
19958eb11cf62dd04ccc2c364b62fd51b4265e2e203Tim Peters                return int(istart + self._randbelow(width))
2002f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            return int(istart + int(self.random()*width))
201d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if step == 1:
2022f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width)
2039146f27b7799dab231083f194a14c6157b57549fTim Peters
2049146f27b7799dab231083f194a14c6157b57549fTim Peters        # Non-unit step argument supplied.
205d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        istep = int(step)
206d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istep != step:
207d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "non-integer step for randrange()"
208d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if istep > 0:
209ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger            n = (width + istep - 1) // istep
210d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        elif istep < 0:
211ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger            n = (width + istep + 1) // istep
212d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
213d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "zero step for randrange()"
214d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
215d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if n <= 0:
216d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            raise ValueError, "empty range for randrange()"
2172f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2182f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if n >= maxwidth:
21994547f7646895e032f8fc145529d9efc3a70760dRaymond Hettinger            return istart + istep*self._randbelow(n)
220d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return istart + istep*int(self.random() * n)
221d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
222d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def randint(self, a, b):
223cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters        """Return random integer in range [a, b], including both end points.
224d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
225d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
226d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return self.randrange(a, b+1)
227d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
2282f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger    def _randbelow(self, n, _log=_log, int=int, _maxwidth=1L<<BPF,
2292f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                   _Method=_MethodType, _BuiltinMethod=_BuiltinMethodType):
2302f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        """Return a random int in the range [0,n)
2312f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2322f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        Handles the case where n has more bits than returned
2332f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        by a single call to the underlying generator.
2342f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        """
2352f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
2362f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        try:
2372f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            getrandbits = self.getrandbits
2382f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        except AttributeError:
2392f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            pass
2402f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        else:
2412f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # Only call self.getrandbits if the original random() builtin method
2422f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # has not been overridden or if a new getrandbits() was supplied.
2432f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            # This assures that the two methods correspond.
2442f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            if type(self.random) is _BuiltinMethod or type(getrandbits) is _Method:
2452f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                k = int(1.00001 + _log(n-1, 2.0))   # 2**k > n-1 > 2**(k-2)
2462f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                r = getrandbits(k)
2472f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                while r >= n:
2482f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                    r = getrandbits(k)
2492f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                return r
2502f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        if n >= _maxwidth:
2512f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger            _warn("Underlying random() generator does not supply \n"
2522f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger                "enough bits to choose from a population range this large")
2532f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger        return int(self.random() * n)
2542f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettinger
255cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- sequence methods  -------------------
256cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
257d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def choice(self, seq):
258d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Choose a random element from a non-empty sequence."""
2595dae505bbd59641a948c81bea981e7c44d4c2343Raymond Hettinger        return seq[int(self.random() * len(seq))]  # raises IndexError if seq is empty
260d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
261d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def shuffle(self, x, random=None, int=int):
262d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """x, random=random.random -> shuffle list x in place; return None.
263d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
264d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        Optional arg random is a 0-argument function returning a random
265d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        float in [0.0, 1.0); by default, the standard random.random.
266d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """
267d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
268d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if random is None:
269d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            random = self.random
27085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger        for i in reversed(xrange(1, len(x))):
271cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters            # pick an element in x[:i+1] with which to exchange x[i]
272d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            j = int(random() * (i+1))
273d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            x[i], x[j] = x[j], x[i]
274d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
275fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger    def sample(self, population, k):
276f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        """Chooses k unique random elements from a population sequence.
277f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
278c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        Returns a new list containing elements from the population while
279c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        leaving the original population unchanged.  The resulting list is
280c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        in selection order so that all sub-slices will also be valid random
281c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        samples.  This allows raffle winners (the sample) to be partitioned
282c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        into grand prize and second place winners (the subslices).
283f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
284c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        Members of the population need not be hashable or unique.  If the
285c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        population contains repeats, then each occurrence is a possible
286c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        selection in the sample.
287f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
288c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        To choose a sample in a range of integers, use xrange as an argument.
289c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        This is especially fast and space efficient for sampling from a
290c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        large population:   sample(xrange(10000000), 60)
291f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        """
292f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
293c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX Although the documentation says `population` is "a sequence",
294c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX attempts are made to cater to any iterable with a __len__
295c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX method.  This has had mixed success.  Examples from both
296c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX sides:  sets work fine, and should become officially supported;
297c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX dicts are much harder, and have failed in various subtle
298c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX ways across attempts.  Support for mapping types should probably
299c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX be dropped (and users should pass mapping.keys() or .values()
300c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        # XXX explicitly).
301c17976e9833f3093adb1019356737e728a24f7c9Tim Peters
302c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        # Sampling without replacement entails tracking either potential
30391e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # selections (the pool) in a list or previous selections in a set.
304c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger
3052b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # When the number of selections is small compared to the
3062b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # population, then tracking selections is efficient, requiring
30791e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # only a small set and an occasional reselection.  For
3082b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # a larger number of selections, the pool tracking method is
3092b55d35850e3e8e0b28aba7878d3f9122a7907acJeremy Hylton        # preferred since the list takes less space than the
31091e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        # set and it doesn't suffer from frequent reselections.
311c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger
312f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        n = len(population)
313f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger        if not 0 <= k <= n:
314f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger            raise ValueError, "sample larger than population"
3158b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger        random = self.random
316fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger        _int = int
317c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        result = [None] * k
31891e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        setsize = 21        # size of a small set minus size of an empty list
31991e27c253c8bb8b6ae8521f1dbb76de7c66ad8cfRaymond Hettinger        if k > 5:
3209e34c047325651853a95f95e538582a4f6d5b7f6Tim Peters            setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
321c17976e9833f3093adb1019356737e728a24f7c9Tim Peters        if n <= setsize or hasattr(population, "keys"):
322c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            # An n-length list is smaller than a k-length set, or this is a
323c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            # mapping type so the other algorithm wouldn't work.
324311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger            pool = list(population)
325311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger            for i in xrange(k):         # invariant:  non-selected at [0,n-i)
326fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger                j = _int(random() * (n-i))
327311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger                result[i] = pool[j]
3288b9aa8dbba644da23ce8417f2d30b218392b3282Raymond Hettinger                pool[j] = pool[n-i-1]   # move non-selected item into vacancy
329c0b4034b8165ce958a23f2c865b51ae0f52040f5Raymond Hettinger        else:
33066d09f1b3029d9cf975ccf26c437c9fb2605db91Raymond Hettinger            try:
3313c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                selected = set()
3323c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                selected_add = selected.add
3333c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                for i in xrange(k):
334fdbe5223b7402ee34c4f0c06caa6faabd9e73e35Raymond Hettinger                    j = _int(random() * n)
3353c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    while j in selected:
3363c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                        j = _int(random() * n)
3373c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    selected_add(j)
3383c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    result[i] = population[j]
339c17976e9833f3093adb1019356737e728a24f7c9Tim Peters            except (TypeError, KeyError):   # handle (at least) sets
3403c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                if isinstance(population, list):
3413c3346daa9bf900080428ed12b6d83aa04f7332bRaymond Hettinger                    raise
342c17976e9833f3093adb1019356737e728a24f7c9Tim Peters                return self.sample(tuple(population), k)
343311f4196284b894f86f56c287c71a0e59c4a72a2Raymond Hettinger        return result
344f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
345cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- real-valued distributions  -------------------
346cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
347cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- uniform distribution -------------------
348d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
349d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def uniform(self, a, b):
350d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        """Get a random number in the range [a, b)."""
351d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return a + (b-a) * self.random()
352ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
353cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- normal distribution --------------------
354ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
355d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def normalvariate(self, mu, sigma):
356c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Normal distribution.
357c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
358c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean, and sigma is the standard deviation.
359ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
360c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
361d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # mu = mean, sigma = standard deviation
362d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
363d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Uses Kinderman and Monahan method. Reference: Kinderman,
364d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # A.J. and Monahan, J.F., "Computer generation of random
365d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # variables using the ratio of uniform deviates", ACM Trans
366d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Math Software, 3, (1977), pp257-260.
367d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
368d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
36942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger        while 1:
370d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u1 = random()
37173ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger            u2 = 1.0 - random()
372d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = NV_MAGICCONST*(u1-0.5)/u2
373d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            zz = z*z/4.0
374d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            if zz <= -_log(u2):
375d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                break
376d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return mu + z*sigma
377ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
378cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- lognormal distribution --------------------
379ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
380d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def lognormvariate(self, mu, sigma):
381c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Log normal distribution.
382c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
383c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        If you take the natural logarithm of this distribution, you'll get a
384c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        normal distribution with mean mu and standard deviation sigma.
385c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu can have any value, and sigma must be greater than zero.
386ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
387c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
388d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return _exp(self.normalvariate(mu, sigma))
389ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
390cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- exponential distribution --------------------
391ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
392d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def expovariate(self, lambd):
393c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Exponential distribution.
394c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
395c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        lambd is 1.0 divided by the desired mean.  (The parameter would be
396c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        called "lambda", but that is a reserved word in Python.)  Returned
397c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        values range from 0 to positive infinity.
398ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
399c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
400d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # lambd: rate lambd = 1/mean
401d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # ('lambda' is a Python reserved word)
402ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
403d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
4040c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        u = random()
405d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        while u <= 1e-7:
406d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u = random()
407d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return -_log(u)/lambd
408ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
409cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- von Mises distribution --------------------
410ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
411d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def vonmisesvariate(self, mu, kappa):
412c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Circular data distribution.
413ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
414c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean angle, expressed in radians between 0 and 2*pi, and
415c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        kappa is the concentration parameter, which must be greater than or
416c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        equal to zero.  If kappa is equal to zero, this distribution reduces
417c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        to a uniform random angle over the range 0 to 2*pi.
418ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
419c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
420d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # mu:    mean angle (in radians between 0 and 2*pi)
421d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # kappa: concentration parameter kappa (>= 0)
422d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # if kappa = 0 generate uniform random angle
4235810297052003f28788f6790ac799fe8e5373494Guido van Rossum
424d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Based upon an algorithm published in: Fisher, N.I.,
425d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # "Statistical Analysis of Circular Data", Cambridge
426d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # University Press, 1993.
4275810297052003f28788f6790ac799fe8e5373494Guido van Rossum
428d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Thanks to Magnus Kessler for a correction to the
429d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # implementation of step 4.
4305810297052003f28788f6790ac799fe8e5373494Guido van Rossum
431d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
432d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if kappa <= 1e-6:
433d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            return TWOPI * random()
434ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
435d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        a = 1.0 + _sqrt(1.0 + 4.0 * kappa * kappa)
436d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        b = (a - _sqrt(2.0 * a))/(2.0 * kappa)
437d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        r = (1.0 + b * b)/(2.0 * b)
438ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
43942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger        while 1:
440d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u1 = random()
441ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
442d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = _cos(_pi * u1)
443d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            f = (1.0 + r * z)/(r + z)
444d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            c = kappa * (r - f)
445ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
446d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            u2 = random()
447ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
44842406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            if u2 < c * (2.0 - c) or u2 <= c * _exp(1.0 - c):
449d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                break
450ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
451d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        u3 = random()
452d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if u3 > 0.5:
453d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            theta = (mu % TWOPI) + _acos(f)
454d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:
455d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            theta = (mu % TWOPI) - _acos(f)
456ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
457d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return theta
458ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
459cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- gamma distribution --------------------
460ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
461d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def gammavariate(self, alpha, beta):
462c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Gamma distribution.  Not the gamma function!
463c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
464c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Conditions on the parameters are alpha > 0 and beta > 0.
465c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
466c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
4678ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
468b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger        # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2
4698ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
470570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        # Warning: a few older sources define the gamma distribution in terms
471570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        # of alpha > -1.0
472570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum        if alpha <= 0.0 or beta <= 0.0:
473570764ddce285afc32e6bd4bce031e421376b382Guido van Rossum            raise ValueError, 'gammavariate: alpha and beta must be > 0.0'
4748ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
475d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
476d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if alpha > 1.0:
477d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
478d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Uses R.C.H. Cheng, "The generation of Gamma
479d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # variables with non-integral shape parameters",
480d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Applied Statistics, (1977), 26, No. 1, p71-74
481d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
482ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            ainv = _sqrt(2.0 * alpha - 1.0)
483ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            bbb = alpha - LOG4
484ca6cdc2c0259b1b74a3f4c2d29a35e76617a3019Raymond Hettinger            ccc = alpha + ainv
4858ac1495a6a1d18111a626cec0c7f2eb67df3edb3Tim Peters
48642406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            while 1:
487d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u1 = random()
48873ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                if not 1e-7 < u1 < .9999999:
48973ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                    continue
49073ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger                u2 = 1.0 - random()
491d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                v = _log(u1/(1.0-u1))/ainv
492d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                x = alpha*_exp(v)
493d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                z = u1*u1*u2
494d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                r = bbb+ccc*v-x
495d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z):
496b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger                    return x * beta
497d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
498d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        elif alpha == 1.0:
499d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # expovariate(1)
5000c9886d589ddebf32de0ca3f027a173222ed383aTim Peters            u = random()
501d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            while u <= 1e-7:
502d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u = random()
503b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger            return -_log(u) * beta
504d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
505d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        else:   # alpha is between 0 and 1 (exclusive)
506d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
507d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
508d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
50942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger            while 1:
510d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u = random()
511d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                b = (_e + alpha)/_e
512d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                p = b*u
513d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                if p <= 1.0:
51442406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                    x = p ** (1.0/alpha)
515d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                else:
516d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                    x = -_log((b-p)/alpha)
517d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                u1 = random()
51842406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                if p > 1.0:
51942406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                    if u1 <= x ** (alpha - 1.0):
52042406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                        break
52142406e6f27e9a42e91db8706d897e0b478b13a4dRaymond Hettinger                elif u1 <= _exp(-x):
522d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters                    break
523b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger            return x * beta
524b760efb08d509bb2acfdef8f4e59dfafa20ca57fRaymond Hettinger
525cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Gauss (faster alternative) --------------------
52695bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
527d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def gauss(self, mu, sigma):
528c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Gaussian distribution.
529c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
530c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        mu is the mean, and sigma is the standard deviation.  This is
531c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        slightly faster than the normalvariate() function.
532c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
533c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Not thread-safe without a lock around calls.
534ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
535c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
536d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
537d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # When x and y are two variables from [0, 1), uniformly
538d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # distributed, then
539d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #
540d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #    cos(2*pi*x)*sqrt(-2*log(1-y))
541d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #    sin(2*pi*x)*sqrt(-2*log(1-y))
542d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        #
543d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # are two *independent* variables with normal distribution
544d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (mu = 0, sigma = 1).
545d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (Lambert Meertens)
546d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # (corrected version; bug discovered by Mike Miller, fixed by LM)
547d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
548d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Multithreading note: When two threads call this function
549d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # simultaneously, it is possible that they will receive the
550d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # same return value.  The window is very small though.  To
551d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # avoid this, you have to use a lock around all calls.  (I
552d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # didn't want to slow this down in the serial case by using a
553d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # lock here.)
554d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
555d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        random = self.random
556d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        z = self.gauss_next
557d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        self.gauss_next = None
558d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        if z is None:
559d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            x2pi = random() * TWOPI
560d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            g2rad = _sqrt(-2.0 * _log(1.0 - random()))
561d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            z = _cos(x2pi) * g2rad
562d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters            self.gauss_next = _sin(x2pi) * g2rad
563d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
564d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return mu + z*sigma
56595bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
566cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- beta --------------------
56785e2e4742d0a1accecd02058a7907df36308297eTim Peters## See
56885e2e4742d0a1accecd02058a7907df36308297eTim Peters## http://sourceforge.net/bugs/?func=detailbug&bug_id=130030&group_id=5470
56985e2e4742d0a1accecd02058a7907df36308297eTim Peters## for Ivan Frohne's insightful analysis of why the original implementation:
57085e2e4742d0a1accecd02058a7907df36308297eTim Peters##
57185e2e4742d0a1accecd02058a7907df36308297eTim Peters##    def betavariate(self, alpha, beta):
57285e2e4742d0a1accecd02058a7907df36308297eTim Peters##        # Discrete Event Simulation in C, pp 87-88.
57385e2e4742d0a1accecd02058a7907df36308297eTim Peters##
57485e2e4742d0a1accecd02058a7907df36308297eTim Peters##        y = self.expovariate(alpha)
57585e2e4742d0a1accecd02058a7907df36308297eTim Peters##        z = self.expovariate(1.0/beta)
57685e2e4742d0a1accecd02058a7907df36308297eTim Peters##        return z/(y+z)
57785e2e4742d0a1accecd02058a7907df36308297eTim Peters##
57885e2e4742d0a1accecd02058a7907df36308297eTim Peters## was dead wrong, and how it probably got that way.
57995bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
580d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def betavariate(self, alpha, beta):
581c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Beta distribution.
582c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
5831b0ce8527112b997194a4e2fb9a1a850c6d73ee8Raymond Hettinger        Conditions on the parameters are alpha > 0 and beta > 0.
584c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        Returned values range between 0 and 1.
585ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
586c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
587ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
58885e2e4742d0a1accecd02058a7907df36308297eTim Peters        # This version due to Janne Sinkkonen, and matches all the std
58985e2e4742d0a1accecd02058a7907df36308297eTim Peters        # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
59085e2e4742d0a1accecd02058a7907df36308297eTim Peters        y = self.gammavariate(alpha, 1.)
59185e2e4742d0a1accecd02058a7907df36308297eTim Peters        if y == 0:
59285e2e4742d0a1accecd02058a7907df36308297eTim Peters            return 0.0
59385e2e4742d0a1accecd02058a7907df36308297eTim Peters        else:
59485e2e4742d0a1accecd02058a7907df36308297eTim Peters            return y / (y + self.gammavariate(beta, 1.))
59595bfcda3e0be2ace895e021296328a383eafb273Guido van Rossum
596cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Pareto --------------------
597cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
598d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def paretovariate(self, alpha):
599c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Pareto distribution.  alpha is the shape parameter."""
600d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Jain, pg. 495
601cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
60273ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger        u = 1.0 - self.random()
603d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return 1.0 / pow(u, 1.0/alpha)
604cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
605cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- Weibull --------------------
606cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
607d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    def weibullvariate(self, alpha, beta):
608c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """Weibull distribution.
609c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger
610c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        alpha is the scale parameter and beta is the shape parameter.
611ef4d4bdc3c99d3120a401b7af6e06610716d2e47Raymond Hettinger
612c32f0336e062dd36f82fb236c66ac25e2bac217bRaymond Hettinger        """
613d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        # Jain, pg. 499; bug fix courtesy Bill Arms
614cf4559a62ec9316a3bb55a67c6fca81ec1ad0d18Guido van Rossum
61573ced7ee995180c0bd8d96ff7d7fb614a744ad7dRaymond Hettinger        u = 1.0 - self.random()
616d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters        return alpha * pow(-_log(u), 1.0/beta)
6176c395ba31609eeffce2428280cc5d95e4fb8058aGuido van Rossum
61840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger## -------------------- Wichmann-Hill -------------------
61940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
62040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettingerclass WichmannHill(Random):
62140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
62240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    VERSION = 1     # used by getstate/setstate
62340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
62440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def seed(self, a=None):
62540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Initialize internal state from hashable object.
62640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
62723f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        None or no argument seeds from current time or from an operating
62823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        system specific randomness source if available.
62940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
63040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        If a is not None or an int or long, hash(a) is used instead.
63140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
63240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        If a is an int or long, a is used directly.  Distinct values between
63340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        0 and 27814431486575L inclusive are guaranteed to yield distinct
63440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        internal states (this guarantee is specific to the default
63540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Wichmann-Hill generator).
63640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
63740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
63840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if a is None:
639c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            try:
640c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger                a = long(_hexlify(_urandom(16)), 16)
641c1c43cad63a88eae694b174c9a0fe6242dd5972bRaymond Hettinger            except NotImplementedError:
642356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                import time
643356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger                a = long(time.time() * 256) # use fractional seconds
64440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
64540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not isinstance(a, (int, long)):
64640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            a = hash(a)
64740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
64840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, x = divmod(a, 30268)
64940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, y = divmod(a, 30306)
65040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, z = divmod(a, 30322)
65140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = int(x)+1, int(y)+1, int(z)+1
65240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
65440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def random(self):
65640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Get the next random number in the range [0.0, 1.0)."""
65740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
65840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Wichman-Hill random number generator.
65940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
66040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Wichmann, B. A. & Hill, I. D. (1982)
66140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Algorithm AS 183:
66240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # An efficient and portable pseudo-random number generator
66340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Applied Statistics 31 (1982) 188-190
66440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
66540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # see also:
66640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Correction to Algorithm AS 183
66740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Applied Statistics 33 (1984) 123
66840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #
66940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        McLeod, A. I. (1985)
67040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        A remark on Algorithm AS 183
67140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        #        Applied Statistics 34 (1985),198-200
67240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
67340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # This part is thread-unsafe:
67440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # BEGIN CRITICAL SECTION
67540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x, y, z = self._seed
67640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = (171 * x) % 30269
67740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = (172 * y) % 30307
67840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = (170 * z) % 30323
67940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = x, y, z
68040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # END CRITICAL SECTION
68140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
68240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Note:  on a platform using IEEE-754 double arithmetic, this can
68340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # never return 0.0 (asserted by Tim; proof too long for a comment).
68440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
68540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
68640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def getstate(self):
68740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Return internal state; can be passed to setstate() later."""
68840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        return self.VERSION, self._seed, self.gauss_next
68940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
69040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def setstate(self, state):
69140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Restore internal state from object returned by getstate()."""
69240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        version = state[0]
69340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if version == 1:
69440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            version, self._seed, self.gauss_next = state
69540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        else:
69640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError("state with version %s passed to "
69740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger                             "Random.setstate() of version %s" %
69840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger                             (version, self.VERSION))
69940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
70040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def jumpahead(self, n):
70140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Act as if n calls to random() were made, but quickly.
70240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
70340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        n is an int, greater than or equal to 0.
70440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
70540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Example use:  If you have 2 threads and know that each will
70640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        consume no more than a million random numbers, create two Random
70740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        objects r1 and r2, then do
70840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            r2.setstate(r1.getstate())
70940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            r2.jumpahead(1000000)
71040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        Then r1 and r2 will use guaranteed-disjoint segments of the full
71140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        period.
71240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
71340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
71440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not n >= 0:
71540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError("n must be >= 0")
71640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x, y, z = self._seed
71740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = int(x * pow(171, n, 30269)) % 30269
71840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = int(y * pow(172, n, 30307)) % 30307
71940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = int(z * pow(170, n, 30323)) % 30323
72040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = x, y, z
72140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def __whseed(self, x=0, y=0, z=0):
72340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Set the Wichmann-Hill seed from (x, y, z).
72440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        These must be integers in the range [0, 256).
72640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
72740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
72840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not type(x) == type(y) == type(z) == int:
72940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise TypeError('seeds must be integers')
73040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256):
73140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            raise ValueError('seeds must be in range(0, 256)')
73240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if 0 == x == y == z:
73340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            # Initialize from current time
73440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            import time
73540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t = long(time.time() * 256)
73640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t = int((t&0xffffff) ^ (t>>24))
73740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, x = divmod(t, 256)
73840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, y = divmod(t, 256)
73940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            t, z = divmod(t, 256)
74040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # Zero is a poor seed, so substitute 1
74140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self._seed = (x or 1, y or 1, z or 1)
74240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.gauss_next = None
74440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger    def whseed(self, a=None):
74640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """Seed from hashable object's hash code.
74740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
74840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        None or no argument seeds from current time.  It is not guaranteed
74940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        that objects with distinct hash codes lead to distinct internal
75040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        states.
75140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
75240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        This is obsolete, provided for compatibility with the seed routine
75340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        used prior to Python 2.1.  Use the .seed() method instead.
75440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        """
75540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
75640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        if a is None:
75740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            self.__whseed()
75840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger            return
75940f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a = hash(a)
76040f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, x = divmod(a, 256)
76140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, y = divmod(a, 256)
76240f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        a, z = divmod(a, 256)
76340f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        x = (x + a) % 256 or 1
76440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        y = (y + a) % 256 or 1
76540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        z = (z + a) % 256 or 1
76640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        self.__whseed(x, y, z)
76740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
76823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger## --------------- Operating System Random Source  ------------------
769356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
77023f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettingerclass SystemRandom(Random):
77123f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    """Alternate random number generator using sources provided
77223f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    by the operating system (such as /dev/urandom on Unix or
77323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger    CryptGenRandom on Windows).
774356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
775356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger     Not available on all systems (see os.urandom() for details).
776356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    """
777356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
778356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def random(self):
779356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        """Get the next random number in the range [0.0, 1.0)."""
7807c2a85b2d44851c2442ade579b760f86447bf848Tim Peters        return (long(_hexlify(_urandom(7)), 16) >> 3) * RECIP_BPF
781356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
782356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def getrandbits(self, k):
783356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        """getrandbits(k) -> x.  Generates a long int with k random bits."""
784356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        if k <= 0:
785356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger            raise ValueError('number of bits must be greater than zero')
786356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        if k != int(k):
787356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger            raise TypeError('number of bits should be an integer')
788356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        bytes = (k + 7) // 8                    # bits / 8 and rounded up
789356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        x = long(_hexlify(_urandom(bytes)), 16)
790356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        return x >> (bytes * 8 - k)             # trim excess bits
791356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
792356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def _stub(self, *args, **kwds):
79323f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        "Stub method.  Not used for a system random number generator."
794356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger        return None
795356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    seed = jumpahead = _stub
796356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
797356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    def _notimplemented(self, *args, **kwds):
79823f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        "Method should not be called for a system random number generator."
79923f1241dc6495eb255e1a389aef204a3e35a2632Raymond Hettinger        raise NotImplementedError('System entropy source does not have state.')
800356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger    getstate = setstate = _notimplemented
801356a4599acd4c835ab88c221bd5da073c9895e83Raymond Hettinger
802cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters## -------------------- test program --------------------
803ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
80462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettingerdef _test_generator(n, func, args):
8050c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    import time
80662297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    print n, 'times', func.__name__
807b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger    total = 0.0
8080c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    sqsum = 0.0
8090c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    smallest = 1e10
8100c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    largest = -1e10
8110c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    t0 = time.time()
8120c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    for i in range(n):
81362297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger        x = func(*args)
814b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger        total += x
8150c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        sqsum = sqsum + x*x
8160c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        smallest = min(x, smallest)
8170c9886d589ddebf32de0ca3f027a173222ed383aTim Peters        largest = max(x, largest)
8180c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    t1 = time.time()
8190c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    print round(t1-t0, 3), 'sec,',
820b98154e4243a8d73f758dfee9a81bbe36ddc05cbRaymond Hettinger    avg = total/n
821d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    stddev = _sqrt(sqsum/n - avg*avg)
8220c9886d589ddebf32de0ca3f027a173222ed383aTim Peters    print 'avg %g, stddev %g, min %g, max %g' % \
8230c9886d589ddebf32de0ca3f027a173222ed383aTim Peters              (avg, stddev, smallest, largest)
824ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossum
825f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettinger
826f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingerdef _test(N=2000):
82762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, random, ())
82862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, normalvariate, (0.0, 1.0))
82962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, lognormvariate, (0.0, 1.0))
83062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, vonmisesvariate, (0.0, 1.0))
83162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.01, 1.0))
83262297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.1, 1.0))
83362297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.1, 2.0))
83462297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.5, 1.0))
83562297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (0.9, 1.0))
83662297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (1.0, 1.0))
83762297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (2.0, 1.0))
83862297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (20.0, 1.0))
83962297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gammavariate, (200.0, 1.0))
84062297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, gauss, (0.0, 1.0))
84162297132215490e9cb406e1a21f03aff40d421cbRaymond Hettinger    _test_generator(N, betavariate, (3.0, 3.0))
842cd804108548e1939bd8646634ed52ef388ee9f44Tim Peters
843715c4c412b21f68ad59773698d06eea8eb0c5a44Tim Peters# Create one instance, seeded from current time, and export its methods
84440f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# as module-level functions.  The functions share state across all uses
84540f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger#(both in the user's code and in the Python libraries), but that's fine
84640f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# for most programs and is easier for the casual user than making them
84740f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger# instantiate their own Random() instance.
84840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger
849d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters_inst = Random()
850d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersseed = _inst.seed
851d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandom = _inst.random
852d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersuniform = _inst.uniform
853d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandint = _inst.randint
854d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterschoice = _inst.choice
855d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersrandrange = _inst.randrange
856f24eb35d185c0623315cfbd9977d37c509860dcfRaymond Hettingersample = _inst.sample
857d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersshuffle = _inst.shuffle
858d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersnormalvariate = _inst.normalvariate
859d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterslognormvariate = _inst.lognormvariate
860d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersexpovariate = _inst.expovariate
861d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersvonmisesvariate = _inst.vonmisesvariate
862d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgammavariate = _inst.gammavariate
863d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgauss = _inst.gauss
864d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersbetavariate = _inst.betavariate
865d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersparetovariate = _inst.paretovariate
866d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersweibullvariate = _inst.weibullvariate
867d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Petersgetstate = _inst.getstate
868d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peterssetstate = _inst.setstate
869d52269bfd029c4a517ea74c17edd5c3a250c366cTim Petersjumpahead = _inst.jumpahead
8702f726e9093381572b21edbfc42659ea89fbdf686Raymond Hettingergetrandbits = _inst.getrandbits
871d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters
872ff03b1ae5bba4d6712563efb7c77ace57dbe6788Guido van Rossumif __name__ == '__main__':
873d7b5e88e8e40b77813ceb25dc28b87d672538403Tim Peters    _test()
874