Non-uniform random variate generation or pseudo-random number sampling is the numerical practice of generating pseudo-random numbers (PRN) that follow a given probability distribution. Methods are typically based on the availability of a uniformly distributed PRN generator. Computational algorithms are then used to manipulate a single random variate, X, or often several such variates, into a new random variate Y such that these values have the required distribution. The first methods were developed for Monte-Carlo simulations in the Manhattan Project,[citation needed] published by John von Neumann in the early 1950s.

Finite discrete distributions

For a discrete probability distribution with a finite number n of indices at which the probability mass function f takes non-zero values, the basic sampling algorithm is straightforward. The interval [0, 1) is divided in n intervals [0, f(1)), [f(1), f(1) + f(2)), ... The width of interval i equals the probability f(i). One draws a uniformly distributed pseudo-random number X, and searches for the index i of the corresponding interval. The so determined i will have the distribution f(i).

Formalizing this idea becomes easier by using the cumulative distribution function

F ( i ) = ∑ j = 1 i f ( j ) . {\displaystyle F(i)=\sum _{j=1}^{i}f(j).}

It is convenient to set F(0) = 0. The n intervals are then simply [F(0), F(1)), [F(1), F(2)), ..., [F(n − 1), F(n)). The main computational task is then to determine i for which F(i − 1) ≤ X < F(i).

This can be done by different algorithms:

  • Linear search, computational time linear in n.
  • Binary search, computational time goes with log n.
  • Indexed search, also called the cutpoint method.
  • Alias method, computational time is constant, using some pre-computed tables.
  • There are other methods that cost constant time.

Continuous distributions

Generic methods for generating independent samples:

Generic methods for generating correlated samples (often necessary for unusually-shaped or high-dimensional distributions):

For generating a normal distribution:

For generating a Poisson distribution:

  • See Poisson distribution#Generating Poisson-distributed random variables

Software libraries

Random distributions provided by software libraries
LibraryBetaBinomialCauchyChi-squaredDirichletExponentialFGammaGeometricGumbelHypergeometricLaplaceLogisticLog-normalLogarithmicMultinomialMultivariate hypergeometricMultivariate normalNegative binomialNoncentral chi-squaredNoncentral FNormalParetoPoissonPowerRayleighStudents's tTriangularvon MisesWaldZeta
NumPyYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYes
GNU Scientific LibraryYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesYesNoYesYesNoNoYesYesYes?YesYesNoNoNoNo

See also

  • Beta distribution#Random variate generation
  • Dirichlet distribution#Random variate generation
  • Exponential distribution#Random variate generation
  • Gamma distribution#Random variate generation
  • Geometric distribution#Random variate generation
  • Gumbel distribution#Random variate generation
  • Laplace distribution#Random variate generation
  • Multinomial distribution#Random variate distribution
  • Pareto distribution#Random variate generation
  • Poisson distribution#Random variate generation

Footnotes

Literature

  • Devroye, L. (1986) . New York: Springer
  • Fishman, G.S. (1996) . New York: Springer
  • Hörmann, W.; J Leydold, G Derflinger (2004,2011) . Berlin: Springer.
  • Knuth, D.E. (1997) The Art of Computer Programming, Vol. 2 Seminumerical Algorithms, Chapter 3.4.1 (3rd edition).
  • Ripley, B.D. (1987) Stochastic Simulation. Wiley.