当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R Random 随机数生成


R语言 Random 位于 base 包(package)。

说明

.Random.seed是一个整数向量,包含随机数生成器(RNG)状态用于生成随机数R。它可以保存和恢复,但用户不应更改。

RNGkind是一个更友好的接口来查询或设置正在使用的RNG类型。

RNGversion可用于设置随机生成器,就像在早期版本中一样R版本(为了重现性)。

set.seed 是指定种子的推荐方法。

用法

.Random.seed <- c(rng.kind, n1, n2, ...)

RNGkind(kind = NULL, normal.kind = NULL, sample.kind = NULL)
RNGversion(vstr)
set.seed(seed, kind = NULL, normal.kind = NULL, sample.kind = NULL)

参数

kind

字符或NULL.如果kind是一个字符串,集合R的 RNG 达到了想要的效果。使用"default"返回到R默认。解释见“详情”NULL.

normal.kind

字符串或NULL。如果是字符串,则设置Normal生成方式。使用"default"返回到R默认。NULL没有改变。

sample.kind

字符串或NULL。如果是字符串,则设置离散均匀生成方式(用于sample, 例如)。使用"default"返回到R默认。NULL没有改变。

seed

单个值,解释为整数,或NULL(请参阅“详细信息”)。

vstr

包含版本号的字符串,例如,"1.6.2"。当前RNG默认配置R如果使用版本vstr大于当前版本。

rng.kind

上述 kind0:k 中的整数代码。

n1, n2, ...

整数。请参阅详细信息以了解需要多少个(这取决于 rng.kind )。

细节

目前可用的 RNG 种类如下。 kind 与此列表部分匹配。默认为 "Mersenne-Twister"

"Wichmann-Hill"

种子 .Random.seed[-1] == r[1:3] 是长度为 3 的整数向量,其中每个 r[i] 位于 1:(p[i] - 1) 中,其中 p 是长度为 3 的素数向量 p = (30269, 30307, 30323) 。 Wichmann-Hill 生成器的周期长度为 (= prod(p-1)/4 ,请参阅应用统计 (1984) 33, 123,其中更正了原始文章)。它在 TestU01 Crush 套件中显示出 12 个明显的故障,在 BigCrush 套件中显示出 22 个明显的故障(L'Ecuyer,2007)。

"Marsaglia-Multicarry"

A multiply-with-carry使用 RNG,正如 George Marsaglia 在他的邮件列表中的帖子中所推荐的那样:sci.stat.math’。它的周期超过 .

它在 L'Ecuyer's TestU01 Crush 套件中表现出 40 个明显的故障。与 Ahrens-Dieter 或 Kinderman-Ramage 结合使用,即使对于单变量分布生成,它也会表现出与正态性的偏差。请参阅PR#18168 进行讨论。

种子是两个整数(所有值都允许)。

"Super-Duper"

Marsaglia 70 年代著名的Super-Duper。这是原始版本,未通过 Diehard 电池的 MTUPLE 测试。对于大多数初始种子来说,它的周期为 。种子是两个整数(第一个种子允许的所有值:第二个必须是奇数)。

我们使用 Reeds 等人 (1982-84) 的实现。

这两个种子分别是 Tausworthe 和同余长整数。与 S 的 .Random.seed[1:12] 的一对一映射是可能的,但我们不会发布,尤其是因为该生成器与最近版本的 S-PLUS 中的生成器并不完全相同。

它在 TestU01 Crush 套件中展示了 25 个明显的故障(L'Ecuyer,2007)。

"Mersenne-Twister"

来自松本和西村(1998);代码于 2002 年更新。具有周期 的扭曲 GFSR 和 623 个连续维度的等分布(在整个周期内)。 ‘seed’ 是一个 624 维的 32 位整数集合加上该集合中的当前位置。

由于 B. D. Ripley,R 使用自己的初始化方法,并且不受 Matsumoto 和 Nishimura 的 1998 年代码中的初始化问题(在 2002 年更新中解决)的影响。

它在 TestU01 Crush 和 BigCrush 套件中都显示出 2 个明显的故障(L'Ecuyer,2007)。

"Knuth-TAOCP-2002"

使用带有减法的滞后斐波那契序列的 32 位整数 GFSR。也就是说,使用的递归是

‘seed’是最后100个数字的集合(实际记录为101个数字,最后一个是缓冲区的循环移位)。该时期约为

"Knuth-TAOCP"

Knuth (1997) 的早期版本。

2002 版本不向后兼容早期版本:种子中 GFSR 的初始化已更改。R不允许您选择连续的种子,报告‘weakness’,并且已经打乱了种子。否则,该算法与Knuth-TAOCP-2002 相同,具有相同的滞后斐波那契递推公式。

该生成器的初始化是在解释中完成的R代码,因此需要很短但值得注意的时间。

它在 TestU01 Crush 套件中表现出 3 个明显的故障,在 BigCrush 套件中表现出 4 个明显的故障(L'Ecuyer,2007)。

"L'Ecuyer-CMRG"

来自 L'Ecuyer (1999) 的“组合 multiple-recursive 生成器”,其中每个元素都是具有三个整数元素的反馈乘法生成器:因此种子是长度为 6 的(有符号)整数向量。周期约为 .

种子的 6 个元素在内部被视为 32 位无符号整数。前三个和后三个都不应该全为零,并且它们分别限制为小于42949670874294944443

这本身并不是特别有趣,但为包 parallel 中使用的多个流提供了基础。

它在 TestU01 Crush 和 BigCrush 套件中都显示了 6 个明显的故障(L'Ecuyer,2007)。

"user-supplied"

使用用户提供的生成器。有关详细信息,请参阅Random.user

normal.kind 可以是 "Kinderman-Ramage""Buggy Kinderman-Ramage" (不适用于 set.seed )、 "Ahrens-Dieter""Box-Muller""Inversion" (默认值)或 "user-supplied" 。 (有关反演,请参阅 qnorm 中的引用。)1.7.0 之前的版本中使用的 Kinderman-Ramage 生成器(现在称为 "Buggy" )有几个近似错误,只能用于重现旧结果。 "Box-Muller" 生成器是有状态的,因为按顺序生成并返回法线对。每当选择它时(即使它是当前的普通生成器)以及当 kind 更改时,状态都会重置。

sample.kind 可以是 "Rounding""Rejection" ,或者与它们部分匹配。前者是 3.6.0 之前版本中的默认设置:它使 sample 在大量群体上明显不均匀,并且只能用于旧结果的再现。请参阅PR#17494 进行讨论。

set.seed 使用单个整数参数来设置所需数量的种子。它旨在作为一种通过指定小整数参数来获取完全不同的种子的简单方法,也是一种为更复杂的方法(尤其是 "Mersenne-Twister""Knuth-TAOCP" )获取有效种子集的方法。无法保证 seed 的不同值将为 RNG 提供不同的种子,尽管任何例外情况都极为罕见。如果使用 seed = NULL 调用,它将重新初始化(参见“注意”),就好像尚未设置种子一样。

RNGkindset.seed 中使用 kind = NULLnormal.kind = NULLsample.kind = NULL 选择 currently-used 生成器(如果工作区已恢复,则包括在上一个会话中使用的生成器):如果未使用生成器它选择"default"

.Random.seedinteger 向量,其第一个元素编码 RNG 和正常生成器的类型。最低两位十进制数字位于 0:(k-1) 中,其中 k 是可用 RNG 的数量。百位代表普通生成器的类型(从 0 开始),万位代表离散均匀采样器的类型。

在底层C中,.Random.seed[-1]unsigned;因此在R .Random.seed[-1]可以为负数,因为无符号整数由有符号整数表示。

RNGkind返回所选 RNG、正常和样本类型的 three-element 字符向量如果任一参数不存在,则调用不可见NULL。类型默认启动会话,并通过调用来选择RNGkind或通过设置.Random.seed在工作区中。 (注:之前R3.6.0 前两种在二元素字符向量中返回。)

RNGversion返回相同的信息RNGkind关于特定的默认值R版本。

set.seed 无形地返回 NULL

注意

最初,没有种子;当需要时,会根据当前时间和进程 ID 创建一个新进程。因此,默认情况下,不同的会话将给出不同的模拟结果。但是,如果恢复之前保存的工作空间,则可能会从之前的会话恢复种子。

.Random.seed 保存均匀随机数生成器的种子集,至少是系统生成器的种子集。它不一定保存其他生成器的状态,特别是不保存Box-Muller普通生成器的状态。如果您想稍后重现工作,请调用 set.seed (最好使用 kindnormal.kind 的显式值)而不是设置 .Random.seed

仅在用户工作区中查找对象.Random.seed

不要依赖 RNG 低阶位的随机性。大多数提供的统一生成器返回转换为双精度的 32 位整数值,因此它们最多采用 不同的值,并且长时间运行将返回重复的值(Wichmann-Hill 是例外,并且所有生成器都给出至少 30 个不同的值)位。)

例子

require(stats)

## Seed the current RNG, i.e., set the RNG status
set.seed(42); u1 <- runif(30)
set.seed(42); u2 <- runif(30) # the same because of identical RNG status:
stopifnot(identical(u1, u2))

## the default random seed is 626 integers, so only print a few
 runif(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.seed
RNGkind("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 about
qbirthday(1 - 1e-6, classes = 2e9) # 235,000

作者

of RNGkind: Martin Maechler. Current implementation, B. D. Ripley with modifications by Duncan Murdoch.

参考

Ahrens, J. H. and Dieter, U. (1973). Extensions of Forsythe's method for random sampling from the normal distribution. Mathematics of Computation, 27, 927-937.

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988). The New S Language. Wadsworth & Brooks/Cole. (set.seed, storing in .Random.seed.)

Box, G. E. P. and Muller, M. E. (1958). A note on the generation of normal random deviates. Annals of Mathematical Statistics, 29, 610-611. doi:10.1214/aoms/1177706645.

De Matteis, A. and Pagnutti, S. (1993). Long-range Correlation Analysis of the Wichmann-Hill Random Number Generator. Statistics and Computing, 3, 67-70. doi:10.1007/BF00153065.

Kinderman, A. J. and Ramage, J. G. (1976). Computer generation of normal random variables. Journal of the American Statistical Association, 71, 893-896. doi:10.2307/2286857.

Knuth, D. E. (1997). The Art of Computer Programming. Volume 2, third edition.
Source code at https://www-cs-faculty.stanford.edu/~knuth/taocp.html.

Knuth, D. E. (2002). The Art of Computer Programming. Volume 2, third edition, ninth printing.

L'Ecuyer, P. (1999). Good parameters and implementations for combined multiple recursive random number generators. Operations Research, 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 ACM Transactions on Mathematical Software, 33, Article 22. doi:10.1145/1268776.1268777.
The TestU01 C library is available from http://simul.iro.umontreal.ca/testu01/tu01.html or also https://github.com/umontreal-simul/TestU01-2009.

Marsaglia, G. (1997). A random number generator for C. Discussion paper, posting on Usenet newsgroup sci.stat.math on September 29, 1997.

Marsaglia, G. and Zaman, A. (1994). Some portable very-long-period random number generators. Computers in Physics, 8, 117-121. doi:10.1063/1.168514.

Matsumoto, M. and Nishimura, T. (1998). Mersenne Twister: A 623-dimensionally equidistributed uniform pseudo-random number generator, ACM Transactions on Modeling and Computer Simulation, 8, 3-30.
Source code formerly at http://www.math.keio.ac.jp/~matumoto/emt.html.
Now see 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 Number Generator. Applied Statistics, 31, 188-190; Remarks: 34, 198 and 35, 89. doi:10.2307/2347988.

也可以看看

sample 用于带或不带替换的随机采样。

Distributions 用于从标准发行版生成 random-variate 的函数。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Random Number Generation。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。