Rev 80840 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/base/man/Random.Rd% Part of the R package, https://www.R-project.org% Copyright 1995-2021 R Core Team% Distributed under GPL 2 or later\name{Random}\alias{Random}\alias{RNG}\alias{RNGkind}\alias{RNGversion}\alias{set.seed}\alias{.Random.seed}\title{Random Number Generation}\description{\code{.Random.seed} is an integer vector, containing the random numbergenerator (RNG) \bold{state} for random number generation in \R. Itcan be saved and restored, but should not be altered by the user.\code{RNGkind} is a more friendly interface to query or set the kindof RNG in use.\code{RNGversion} can be used to set the random generators as theywere in an earlier \R version (for reproducibility).\code{set.seed} is the recommended way to specify seeds.}\usage{\special{.Random.seed <- c(rng.kind, n1, n2, \dots)}RNGkind(kind = NULL, normal.kind = NULL, sample.kind = NULL)RNGversion(vstr)set.seed(seed, kind = NULL, normal.kind = NULL, sample.kind = NULL)}\arguments{\item{kind}{character or \code{NULL}. If \code{kind} is a characterstring, set \R's RNG to the kind desired. Use \code{"default"} toreturn to the \R default. See \sQuote{Details} for theinterpretation of \code{NULL}.}\item{normal.kind}{character string or \code{NULL}. If it is a characterstring, set the method of Normal generation. Use \code{"default"}to return to the \R default. \code{NULL} makes no change.}\item{sample.kind}{character string or \code{NULL}. If it is a characterstring, set the method of discrete uniform generation (used in\code{\link{sample}}, for instance). Use \code{"default"} to return tothe \R default. \code{NULL} makes no change.}\item{seed}{a single value, interpreted as an integer, or \code{NULL}(see \sQuote{Details}).}\item{vstr}{a character string containing a version number,e.g., \code{"1.6.2"}. The default RNG configuration of the current\R version is used if \code{vstr} is greater than the current version.}\item{rng.kind}{integer code in \code{0:k} for the above \code{kind}.}\item{n1, n2, \dots}{integers. See the details for how many are required(which depends on \code{rng.kind}).}}%% source and more detailed references: ../../../main/RNG.c\details{The currently available RNG kinds are given below. \code{kind} ispartially matched to this list. The default is\code{"Mersenne-Twister"}.\describe{\item{\code{"Wichmann-Hill"}}{The seed, \code{.Random.seed[-1] == r[1:3]} is an integer vector oflength 3, where each \code{r[i]} is in \code{1:(p[i] - 1)}, where\code{p} is the length 3 vector of primes, \code{p = (30269, 30307,30323)}.The Wichmann--Hill generator has a cycle length of\eqn{6.9536 \times 10^{12}}{6.9536e12} (=\code{prod(p-1)/4}, see \emph{Applied Statistics} (1984)\bold{33}, 123 which corrects the original article).It exhibits 12 clear failures in the TestU01 Crush suite and 22in the BigCrush suite (\emph{L'Ecuyer}, 2007).}\item{\code{"Marsaglia-Multicarry"}:}{A \emph{multiply-with-carry} RNG is used, as recommended by GeorgeMarsaglia in his post to the mailing list \file{sci.stat.math}.It has a period of more than \eqn{2^{60}}{2^60}.It exhibits 40 clear failures in L'Ecuyer's TestU01 Crush suite.Combined with Ahrens-Dieter or Kinderman-Ramage it exhibitsdeviations from normality even for univariate distributiongeneration. See \PR{18168} for a discussion.The seed is two integers (all values allowed).}\item{\code{"Super-Duper"}:}{Marsaglia's famous Super-Duper from the 70's. This is the originalversion which does \emph{not} pass the MTUPLE test of the Diehardbattery. It has a period of \eqn{\approx 4.6\times 10^{18}}{about4.6*10^18} for most initial seeds. The seed is two integers (allvalues allowed for the first seed: the second must be odd).We use the implementation by Reeds \emph{et al} (1982--84).The two seeds are the Tausworthe and congruence long integers,respectively. A one-to-one mapping to S's \code{.Random.seed[1:12]}is possible but we will not publish one, not least as this generatoris \bold{not} exactly the same as that in recent versions of S-PLUS.It exhibits 25 clear failures in the TestU01 Crush suite (\emph{L'Ecuyer}, 2007).}\item{\code{"Mersenne-Twister"}:}{From Matsumoto and Nishimura (1998); code updated in 2002.A twisted GFSR with period\eqn{2^{19937} - 1}{2^19937 - 1} and equidistribution in 623consecutive dimensions (over the whole period). The \sQuote{seed} is a624-dimensional set of 32-bit integers plus a current position inthat set.R uses its own initialization method due to B. D. Ripley and isnot affected by the initialization issue in the 1998 code ofMatsumoto and Nishimura addressed in a 2002 update.It exhibits 2 clear failures in each of the TestU01 Crush and theBigCrush suite (\emph{L'Ecuyer}, 2007).}\item{\code{"Knuth-TAOCP-2002"}:}{A 32-bit integer GFSR using lagged Fibonacci sequences withsubtraction. That is, the recurrence used is\deqn{X_j = (X_{j-100} - X_{j-37}) \bmod 2^{30}%}{X[j] = (X[j-100] - X[j-37]) mod 2^30}and the \sQuote{seed} is the set of the 100 last numbers (actuallyrecorded as 101 numbers, the last being a cyclic shift of thebuffer). The period is around \eqn{2^{129}}{2^129}.}\item{\code{"Knuth-TAOCP"}:}{An earlier version from Knuth (1997).The 2002 version was not backwards compatible with the earlierversion: the initialization of the GFSR from the seed was altered.\R did not allow you to choose consecutive seeds, the reported\sQuote{weakness}, and already scrambled the seeds. Otherwise,the algorithm is identical to Knuth-TAOCP-2002, with the samelagged Fibonacci recurrence formula.Initialization of this generator is done in interpreted \R codeand so takes a short but noticeable time.It exhibits 3 clear failure in the TestU01 Crush suite and4 clear failures in the BigCrush suite(\emph{L'Ecuyer}, 2007).}\item{\code{"L'Ecuyer-CMRG"}:}{A \sQuote{combined multiple-recursive generator} from L'Ecuyer(1999), each element of which is a feedback multiplicativegenerator with three integer elements: thus the seed is a (signed)integer vector of length 6. The period is around\eqn{2^{191}}{2^191}.The 6 elements of the seed are internally regarded as 32-bitunsigned integers. Neither the first three nor the last threeshould be all zero, and they are limited to less than\code{4294967087} and \code{4294944443} respectively.This is not particularly interesting of itself, but provides thebasis for the multiple streams used in package \pkg{parallel}.% See \code{\link{RngStream}}.It exhibits 6 clear failures in each of the TestU01 Crush and theBigCrush suite (\emph{L'Ecuyer}, 2007).}\item{\code{"user-supplied"}:}{Use a user-supplied generator. See \code{\link{Random.user}} fordetails.}}\code{normal.kind} can be \code{"Kinderman-Ramage"},\code{"Buggy Kinderman-Ramage"} (not for \code{set.seed}),\code{"Ahrens-Dieter"}, \code{"Box-Muller"}, \code{"Inversion"} (thedefault), or \code{"user-supplied"}. (For inversion, see thereference in \code{\link{qnorm}}.) The Kinderman-Ramage generatorused in versions prior to 1.7.0 (now called \code{"Buggy"}) had severalapproximation errors and should only be used for reproduction of oldresults. The \code{"Box-Muller"} generator is stateful as pairs ofnormals are generated and returned sequentially. The state is resetwhenever it is selected (even if it is the current normal generator)and when \code{kind} is changed.\code{sample.kind} can be \code{"Rounding"} or \code{"Rejection"},or partial matches to these. The former was the default in versionsprior to 3.6.0: it made \code{\link{sample}} noticeably non-uniformon large populations, and should only be used for reproduction of oldresults. See \PR{17494} for a discussion.\code{set.seed} uses a single integer argument to set as many seedsas are required. It is intended as a simple way to get quite differentseeds by specifying small integer arguments, and also as a way to getvalid seed sets for the more complicated methods (especially\code{"Mersenne-Twister"} and \code{"Knuth-TAOCP"}). There is noguarantee that different values of \code{seed} will seed the RNGdifferently, although any exceptions would be extremely rare. Ifcalled with \code{seed = NULL} it re-initializes (see \sQuote{Note})as if no seed had yet been set.The use of \code{kind = NULL}, \code{normal.kind = NULL} or\code{sample.kind = NULL} in\code{RNGkind} or \code{set.seed} selects the currently-usedgenerator (including that used in the previous session if theworkspace has been restored): if no generator has been used it selects\code{"default"}.}\note{Initially, there is no seed; a new one is created from the currenttime and the process ID when one is required. Hence differentsessions will give different simulation results, by default. However,the seed might be restored from a previous session if a previouslysaved workspace is restored.\code{.Random.seed} saves the seed set for the uniform random-numbergenerator, at least for the system generators. It does notnecessarily save the state of other generators, and in particular doesnot save the state of the Box--Muller normal generator. If you wantto reproduce work later, call \code{set.seed} (preferably withexplicit values for \code{kind} and \code{normal.kind}) rather thanset \code{.Random.seed}.The object \code{.Random.seed} is only looked for in the user'sworkspace.Do not rely on randomness of low-order bits from RNGs. Most of thesupplied uniform generators return 32-bit integer values that areconverted to doubles, so they take at most \eqn{2^{32}}{2^32} distinctvalues and long runs will return duplicated values (Wichmann-Hill isthe exception, and all give at least 30 varying bits.)}\value{\code{.Random.seed} is an \code{\link{integer}} vector whose firstelement \emph{codes} the kind of RNG and normal generator. The lowesttwo decimal digits are in \code{0:(k-1)}where \code{k} is the number of available RNGs. The hundredsrepresent the type of normal generator (starting at \code{0}), andthe ten thousands represent the type of discrete uniform sampler.In the underlying C, \code{.Random.seed[-1]} is \code{unsigned};therefore in \R \code{.Random.seed[-1]} can be negative, due tothe representation of an unsigned integer by a signed integer.\code{RNGkind} returns a three-element character vector of the RNG,normal and sample kinds selected \emph{before} the call, invisibly ifeither argument is not \code{NULL}. A type starts a session as thedefault, and is selected either by a call to \code{RNGkind} or by setting\code{.Random.seed} in the workspace. (NB: prior to \R 3.6.0 the firsttwo kinds were returned in a two-element character vector.)\code{RNGversion} returns the same information as \code{RNGkind} aboutthe defaults in a specific \R version.\code{set.seed} returns \code{NULL}, invisibly.}\references{Ahrens, J. H. and Dieter, U. (1973).Extensions of Forsythe's method for random sampling from the normaldistribution.\emph{Mathematics of Computation}, \bold{27}, 927--937.Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988).\emph{The New S Language}.Wadsworth & Brooks/Cole.(\code{set.seed}, storing in \code{.Random.seed}.)Box, G. E. P. and Muller, M. E. (1958).A note on the generation of normal random deviates.\emph{Annals of Mathematical Statistics}, \bold{29}, 610--611.\doi{10.1214/aoms/1177706645}.De Matteis, A. and Pagnutti, S. (1993).Long-range Correlation Analysis of the Wichmann-Hill Random NumberGenerator.\emph{Statistics and Computing}, \bold{3}, 67--70.\doi{10.1007/BF00153065}.Kinderman, A. J. and Ramage, J. G. (1976).Computer generation of normal random variables.\emph{Journal of the American Statistical Association}, \bold{71},893--896.\doi{10.2307/2286857}.Knuth, D. E. (1997).\emph{The Art of Computer Programming}.Volume 2, third edition.\crSource code at \url{https://www-cs-faculty.stanford.edu/~knuth/taocp.html}.Knuth, D. E. (2002).\emph{The Art of Computer Programming}.Volume 2, third edition, ninth printing.L'Ecuyer, P. (1999).Good parameters and implementations for combined multiple recursiverandom number generators.\emph{Operations Research}, \bold{47}, 159--164.\doi{10.1287/opre.47.1.159}.L'Ecuyer, P. and Simard, R. (2007).TestU01: A C Library for Empirical Testing of Random Number Generators\emph{ACM Transactions on Mathematical Software}, \bold{33}, Article 22.\doi{10.1145/1268776.1268777}.\cr The TestU01 C library is available from\url{http://simul.iro.umontreal.ca/testu01/tu01.html} or also\url{https://github.com/umontreal-simul/TestU01-2009}.Marsaglia, G. (1997).\emph{A random number generator for C}.Discussion paper, posting on Usenet newsgroup \code{sci.stat.math} onSeptember 29, 1997.Marsaglia, G. and Zaman, A. (1994).Some portable very-long-period random number generators.\emph{Computers in Physics}, \bold{8}, 117--121.\doi{10.1063/1.168514}.Matsumoto, M. and Nishimura, T. (1998).Mersenne Twister: A 623-dimensionally equidistributed uniformpseudo-random number generator,\emph{ACM Transactions on Modeling and Computer Simulation},\bold{8}, 3--30.\crSource code formerly at \code{http://www.math.keio.ac.jp/~matumoto/emt.html}.\crNow see \url{http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/c-lang.html}.Reeds, J., Hubert, S. and Abrahams, M. (1982--4).C implementation of SuperDuper, University of California at Berkeley.(Personal communication from Jim Reeds to Ross Ihaka.)Wichmann, B. A. and Hill, I. D. (1982).Algorithm AS 183: An Efficient and Portable Pseudo-random NumberGenerator.\emph{Applied Statistics}, \bold{31}, 188--190; Remarks:\bold{34}, 198 and \bold{35}, 89.\doi{10.2307/2347988}.}\author{of RNGkind: Martin Maechler. Current implementation, B. D. Ripleywith modifications by Duncan Murdoch.}\seealso{\code{\link{sample}} for random sampling with and without replacement.\link{Distributions} for functions for random-variate generation fromstandard distributions.}\examples{require(stats)## Seed the current RNG, i.e., set the RNG statusset.seed(42); u1 <- runif(30)set.seed(42); u2 <- runif(30) # the same because of identical RNG status:stopifnot(identical(u1, u2))\donttest{## the default random seed is 626 integers, so only print a fewrunif(1); .Random.seed[1:6]; runif(1); .Random.seed[1:6]## If there is no seed, a "random" new one is created:rm(.Random.seed); runif(1); .Random.seed[1:6]}ok <- RNGkind()RNGkind("Wich") # (partial string matching on 'kind')## This shows how 'runif(.)' works for Wichmann-Hill,## using only R functions:p.WH <- c(30269, 30307, 30323)a.WH <- c( 171, 172, 170)next.WHseed <- function(i.seed = .Random.seed[-1]){ (a.WH * i.seed) \%\% p.WH }my.runif1 <- function(i.seed = .Random.seed){ ns <- next.WHseed(i.seed[-1]); sum(ns / p.WH) \%\% 1 }set.seed(1998-12-04)# (when the next lines were added to the souRce)rs <- .Random.seed(WHs <- next.WHseed(rs[-1]))u <- runif(1)stopifnot(next.WHseed(rs[-1]) == .Random.seed[-1],all.equal(u, my.runif1(rs)))## ----.Random.seedRNGkind("Super") # matches "Super-Duper"RNGkind().Random.seed # new, corresponding to Super-Duper## Reset:RNGkind(ok[1])RNGversion(getRversion()) # the default version for this R version## ----sum(duplicated(runif(1e6))) # around 110 for default generator## and we would expect about almost sure duplicates beyond aboutqbirthday(1 - 1e-6, classes = 2e9) # 235,000}\keyword{distribution}\keyword{sysdata}