\section{\module{random} ---
         Generate pseudo-random numbers}

\declaremodule{standard}{random}
\modulesynopsis{Generate pseudo-random numbers with various common
                distributions.}


This module implements pseudo-random number generators for various
distributions.
For integers, uniform selection from a range.
For sequences, uniform selection of a random element, and a function to
generate a random permutation of a list in-place.
On the real line, there are functions to compute uniform, normal (Gaussian),
lognormal, negative exponential, gamma, and beta distributions.
For generating distribution of angles, the circular uniform and
von Mises distributions are available.

Almost all module functions depend on the basic function
\function{random()}, which generates a random float uniformly in
the semi-open range [0.0, 1.0).  Python uses the standard Wichmann-Hill
generator, combining three pure multiplicative congruential
generators of modulus 30269, 30307 and 30323.  Its period (how many
numbers it generates before repeating the sequence exactly) is
6,953,607,871,644.  While of much higher quality than the \function{rand()}
function supplied by most C libraries, the theoretical properties
are much the same as for a single linear congruential generator of
large modulus.  It is not suitable for all purposes, and is completely
unsuitable for cryptographic purposes.

The functions in this module are not threadsafe:  if you want to call these
functions from multiple threads, you should explicitly serialize the calls.
Else, because no critical sections are implemented internally, calls
from different threads may see the same return values.

The functions supplied by this module are actually bound methods of a
hidden instance of the \var{random.Random} class.  You can instantiate your
own instances of \var{Random} to get generators that don't share state.
This is especially useful for multi-threaded programs, creating a different
instance of \var{Random} for each thread, and using the \method{jumpahead()}
method to ensure that the generated sequences seen by each thread don't
overlap (see example below).
Class \var{Random} can also be subclassed if you want to use a different
basic generator of your own devising:  in that case, override the
\method{random()}, \method{seed()}, \method{getstate()},
\method{setstate()} and \method{jumpahead()} methods.

Here's one way to create threadsafe distinct and non-overlapping generators:

\begin{verbatim}
def create_generators(num, delta, firstseed=None):
    """Return list of num distinct generators.
    Each generator has its own unique segment of delta elements
    from Random.random()'s full period.
    Seed the first generator with optional arg firstseed (default
    is None, to seed from current time).
    """

    from random import Random
    g = Random(firstseed)
    result = [g]
    for i in range(num - 1):
        laststate = g.getstate()
        g = Random()
        g.setstate(laststate)
        g.jumpahead(delta)
        result.append(g)
    return result

gens = create_generators(10, 1000000)
\end{verbatim}

That creates 10 distinct generators, which can be passed out to 10 distinct
threads.  The generators don't share state so can be called safely in
parallel.  So long as no thread calls its \code{g.random()} more than a
million times (the second argument to \function{create_generators), the
sequences seen by each thread will not overlap.  The period of the
underlying Wichmann-Hill generator limits how far this technique can be
pushed.

Just for fun, note that since we know the period, \method{jumpahead()} can
also be used to "move backward in time":

\begin{verbatim}
>>> g = Random(42)  # arbitrary
>>> g.random()
0.25420336316883324
>>> g.jumpahead(6953607871644L - 1) # move *back* one
>>> g.random()
0.25420336316883324
\end{verbatim}


Bookkeeping functions:

\begin{funcdesc}{seed}{\optional{x}}
  Initialize the basic random number generator.
  Optional argument \var{x} can be any hashable object.
  If \var(x) is omitted or \code{None}, current system time is used;
  current system time is also used to initialize the generator when the
  module is first imported.
  If \var(x) is not \code{None} or an int or long,
  \code{hash(\var{x})) is used instead.
  If \var{x} is an int or long, \var{x} is used directly.
  Distinct values between 0 and 27814431486575L inclusive are guaranteed
  to yield distinct internal states (this guarantee is specific to the
  default Wichmann-Hill generator, and may not apply to subclasses
  supplying their own basic generator).
\end{funcdesc}

\begin{funcdesc}{whseed}{\optional{x}}
  This is obsolete, supplied for bit-level compatibility with versions
  of Python prior to 2.1.
  See \function{seed} for details.  \function{whseed} does not guarantee
  that distinct integer arguments yield distinct internal states, and can
  yield no more than about 2**24 distinct internal states in all.
\end{funcdesc}

\begin{funcdesc}{getstate}{}
  Return an object capturing the current internal state of the generator.
  This object can be passed to \code{setstate()} to restore the state.
  \versionadded{2.1}
\end{funcdesc}

\begin{funcdesc}{setstate}{state}
  \var{state} should have been obtained from a previous call to
  \code{getstate()}, and \code{setstate()} restores the internal state
  of the generator to what it was at the time \code{setstate()} was called.
  \versionadded{2.1}
 \end{funcdesc}

\begin{funcdesc}{jumpahead}{n}
  Change the internal state to what it would be if \code{random()} were
  called n times, but do so quickly.  \var{n} is a non-negative integer.
  This is most useful in multi-threaded programs, in conjuction with
  multiple instances of the \var{Random} class:  \method{setstate()} or
  \method{seed()} can be used to force all instances into the same
  internal state, and then \method{jumpahead()} can be used to force the
  instances' states as far apart as you like (up to the period of the
  generator).
  \versionadded{2.1}
 \end{funcdesc}

Functions for integers:

\begin{funcdesc}{randrange}{\optional{start,} stop\optional{, step}}
  Return a randomly selected element from \code{range(\var{start},
  \var{stop}, \var{step})}.  This is equivalent to
  \code{choice(range(\var{start}, \var{stop}, \var{step}))},
  but doesn't actually build a range object.
  \versionadded{1.5.2}
\end{funcdesc}

\begin{funcdesc}{randint}{a, b}
  \deprecated{2.0}{Use \function{randrange()} instead.}
  Return a random integer \var{N} such that
  \code{\var{a} <= \var{N} <= \var{b}}.
\end{funcdesc}


Functions for sequences:

\begin{funcdesc}{choice}{seq}
  Return a random element from the non-empty sequence \var{seq}.
\end{funcdesc}

\begin{funcdesc}{shuffle}{x\optional{, random}}
  Shuffle the sequence \var{x} in place.
  The optional argument \var{random} is a 0-argument function
  returning a random float in [0.0, 1.0); by default, this is the
  function \function{random()}.

  Note that for even rather small \code{len(\var{x})}, the total
  number of permutations of \var{x} is larger than the period of most
  random number generators; this implies that most permutations of a
  long sequence can never be generated.
\end{funcdesc}


The following functions generate specific real-valued distributions.
Function parameters are named after the corresponding variables in the
distribution's equation, as used in common mathematical practice; most of
these equations can be found in any statistics text.

\begin{funcdesc}{random}{}
  Return the next random floating point number in the range [0.0, 1.0).
\end{funcdesc}

\begin{funcdesc}{uniform}{a, b}
  Return a random real number \var{N} such that
  \code{\var{a} <= \var{N} < \var{b}}.
\end{funcdesc}

\begin{funcdesc}{betavariate}{alpha, beta}
  Beta distribution.  Conditions on the parameters are
  \code{\var{alpha} > -1} and \code{\var{beta} > -1}.
  Returned values range between 0 and 1.
\end{funcdesc}

\begin{funcdesc}{cunifvariate}{mean, arc}
  Circular uniform distribution.  \var{mean} is the mean angle, and
  \var{arc} is the range of the distribution, centered around the mean
  angle.  Both values must be expressed in radians, and can range
  between 0 and \emph{pi}.  Returned values range between
  \code{\var{mean} - \var{arc}/2} and \code{\var{mean} +
  \var{arc}/2}.
\end{funcdesc}

\begin{funcdesc}{expovariate}{lambd}
  Exponential distribution.  \var{lambd} is 1.0 divided by the desired
  mean.  (The parameter would be called ``lambda'', but that is a
  reserved word in Python.)  Returned values range from 0 to
  positive infinity.
\end{funcdesc}

\begin{funcdesc}{gamma}{alpha, beta}
  Gamma distribution.  (\emph{Not} the gamma function!)  Conditions on
  the parameters are \code{\var{alpha} > -1} and \code{\var{beta} > 0}.
\end{funcdesc}

\begin{funcdesc}{gauss}{mu, sigma}
  Gaussian distribution.  \var{mu} is the mean, and \var{sigma} is the
  standard deviation.  This is slightly faster than the
  \function{normalvariate()} function defined below.
\end{funcdesc}

\begin{funcdesc}{lognormvariate}{mu, sigma}
  Log normal distribution.  If you take the natural logarithm of this
  distribution, you'll get a normal distribution with mean \var{mu}
  and standard deviation \var{sigma}.  \var{mu} can have any value,
  and \var{sigma} must be greater than zero.
\end{funcdesc}

\begin{funcdesc}{normalvariate}{mu, sigma}
  Normal distribution.  \var{mu} is the mean, and \var{sigma} is the
  standard deviation.
\end{funcdesc}

\begin{funcdesc}{vonmisesvariate}{mu, kappa}
  \var{mu} is the mean angle, expressed in radians between 0 and
  2*\emph{pi}, and \var{kappa} is the concentration parameter, which
  must be greater than or equal to zero.  If \var{kappa} is equal to
  zero, this distribution reduces to a uniform random angle over the
  range 0 to 2*\emph{pi}.
\end{funcdesc}

\begin{funcdesc}{paretovariate}{alpha}
  Pareto distribution.  \var{alpha} is the shape parameter.
\end{funcdesc}

\begin{funcdesc}{weibullvariate}{alpha, beta}
  Weibull distribution.  \var{alpha} is the scale parameter and
  \var{beta} is the shape parameter.
\end{funcdesc}


\begin{seealso}
  \seetext{Wichmann, B. A. \& Hill, I. D., ``Algorithm AS 183:
           An efficient and portable pseudo-random number generator'',
           \citetitle{Applied Statistics} 31 (1982) 188-190.}
\end{seealso}
