cinap_lenrekadd hg and python4bb9e2215 years agoHistory
309 lines · 12.4 KB · TeX
RawDownload
\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 variousdistributions. For integers, uniform selection from a range.For sequences, uniform selection of a random element, a function togenerate a random permutation of a list in-place, and a function forrandom sampling without replacement. On the real line, there are functions to compute uniform, normal (Gaussian),lognormal, negative exponential, gamma, and beta distributions.For generating distributions of angles, the von Mises distributionis available. Almost all module functions depend on the basic function\function{random()}, which generates a random float uniformly inthe semi-open range [0.0, 1.0).  Python uses the Mersenne Twister asthe core generator.  It produces 53-bit precision floats and has aperiod of 2**19937-1.  The underlying implementation in Cis both fast and threadsafe.  The Mersenne Twister is one of the mostextensively tested random number generators in existence.  However, beingcompletely deterministic, it is not suitable for all purposes, and iscompletely unsuitable for cryptographic purposes. The functions supplied by this module are actually bound methods of ahidden instance of the \class{random.Random} class.  You caninstantiate your own instances of \class{Random} to get generatorsthat don't share state.  This is especially useful for multi-threadedprograms, creating a different instance of \class{Random} for eachthread, and using the \method{jumpahead()} method to make it likely that thegenerated sequences seen by each thread don't overlap. Class \class{Random} can also be subclassed if you want to use adifferent basic generator of your own devising: in that case, overridethe \method{random()}, \method{seed()}, \method{getstate()},\method{setstate()} and \method{jumpahead()} methods.Optionally, a new generator can supply a \method{getrandombits()}method --- this allows \method{randrange()} to produce selectionsover an arbitrarily large range.\versionadded[the \method{getrandombits()} method]{2.4} As an example of subclassing, the \module{random} module providesthe \class{WichmannHill} class that implements an alternative generatorin pure Python.  The class provides a backward compatible way toreproduce results from earlier versions of Python, which used theWichmann-Hill algorithm as the core generator.  Note that this Wichmann-Hillgenerator can no longer be recommended:  its period is too short bycontemporary standards, and the sequence generated is known to fail somestringent randomness tests.  See the references below for a recentvariant that repairs these flaws.\versionchanged[Substituted MersenneTwister for Wichmann-Hill]{2.3}  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 randomness sources are provided by the  operating system, they are used instead of the system time (see the  \function{os.urandom()}  function for details on availability).  \versionchanged[formerly,  operating system resources were not used]{2.4}  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.\end{funcdesc} \begin{funcdesc}{getstate}{}  Return an object capturing the current internal state of the  generator.  This object can be passed to \function{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  \function{getstate()}, and \function{setstate()} restores the  internal state of the generator to what it was at the time  \function{setstate()} was called.  \versionadded{2.1}\end{funcdesc} \begin{funcdesc}{jumpahead}{n}  Change the internal state to one different from and likely far away from  the current state.  \var{n} is a non-negative integer which is used to  scramble the current state vector.  This is most useful in multi-threaded  programs, in conjuction with multiple instances of the \class{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 far apart.  \versionadded{2.1}  \versionchanged[Instead of jumping to a specific state, \var{n} steps  ahead, \method{jumpahead(\var{n})} jumps to another state likely to be  separated by many steps]{2.3} \end{funcdesc} \begin{funcdesc}{getrandbits}{k}  Returns a python \class{long} int with \var{k} random bits.  This method is supplied with the MersenneTwister generator and some  other generators may also provide it as an optional part of the API.  When available, \method{getrandbits()} enables \method{randrange()}  to handle arbitrarily large ranges.  \versionadded{2.4}\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}  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}.  If \var{seq} is empty, raises \exception{IndexError}.\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} \begin{funcdesc}{sample}{population, k}  Return a \var{k} length list of unique elements chosen from the  population sequence.  Used for random sampling without replacement.  \versionadded{2.3}   Returns a new list containing elements from the population while  leaving the original population unchanged.  The resulting list is  in selection order so that all sub-slices will also be valid random  samples.  This allows raffle winners (the sample) to be partitioned  into grand prize and second place winners (the subslices).   Members of the population need not be hashable or unique.  If the  population contains repeats, then each occurrence is a possible  selection in the sample.   To choose a sample from a range of integers, use an \function{xrange()}  object as an argument.  This is especially fast and space efficient for  sampling from a large population:  \code{sample(xrange(10000000), 60)}.\end{funcdesc}  The following functions generate specific real-valued distributions.Function parameters are named after the corresponding variables in thedistribution's equation, as used in common mathematical practice; most ofthese 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} > 0} and \code{\var{beta} > 0}.  Returned values range between 0 and 1.\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}{gammavariate}{alpha, beta}  Gamma distribution.  (\emph{Not} the gamma function!)  Conditions on  the parameters are \code{\var{alpha} > 0} 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} Alternative Generators: \begin{classdesc}{WichmannHill}{\optional{seed}}Class that implements the Wichmann-Hill algorithm as the core generator.Has all of the same methods as \class{Random} plus the \method{whseed()}method described below.  Because this class is implemented in purePython, it is not threadsafe and may require locks between calls.  Theperiod of the generator is 6,953,607,871,644 which is small enough torequire care that two independent random sequences do not overlap.\end{classdesc} \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{classdesc}{SystemRandom}{\optional{seed}}Class that uses the \function{os.urandom()} function for generatingrandom numbers from sources provided by the operating system.Not available on all systems.Does not rely on software state and sequences are not reproducible.Accordingly, the \method{seed()} and \method{jumpahead()} methodshave no effect and are ignored.  The \method{getstate()} and\method{setstate()} methods raise \exception{NotImplementedError} ifcalled.\versionadded{2.4}\end{classdesc} Examples of basic usage: \begin{verbatim}>>> random.random()        # Random float x, 0.0 <= x < 1.00.37444887175646646>>> random.uniform(1, 10)  # Random float x, 1.0 <= x < 10.01.1800146073117523>>> random.randint(1, 10)  # Integer from 1 to 10, endpoints included7>>> random.randrange(0, 101, 2)  # Even integer from 0 to 10026>>> random.choice('abcdefghij')  # Choose a random element'c' >>> items = [1, 2, 3, 4, 5, 6, 7]>>> random.shuffle(items)>>> items[7, 3, 2, 5, 6, 4, 1] >>> random.sample([1, 2, 3, 4, 5],  3)  # Choose 3 elements[4, 1, 5] \end{verbatim} \begin{seealso}  \seetext{M. Matsumoto and T. Nishimura, ``Mersenne Twister: A	   623-dimensionally equidistributed uniform pseudorandom	   number generator'',	   \citetitle{ACM Transactions on Modeling and Computer Simulation}	   Vol. 8, No. 1, January pp.3-30 1998.}   \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.}   \seeurl{http://www.npl.co.uk/ssfm/download/abstracts.html\#196}{A modern          variation of the Wichmann-Hill generator that greatly increases          the period, and passes now-standard statistical tests that the          original generator failed.}\end{seealso}