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 |
字符或 |
normal.kind |
字符串或 |
sample.kind |
字符串或 |
seed |
单个值,解释为整数,或 |
vstr |
包含版本号的字符串,例如, |
rng.kind |
上述 |
n1, n2, ... |
整数。请参阅详细信息以了解需要多少个(这取决于 |
细节
目前可用的 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 位无符号整数。前三个和后三个都不应该全为零,并且它们分别限制为小于
4294967087
和4294944443
。这本身并不是特别有趣,但为包
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
调用,它将重新初始化(参见“注意”),就好像尚未设置种子一样。
在 RNGkind
或 set.seed
中使用 kind = NULL
、 normal.kind = NULL
或 sample.kind = NULL
选择 currently-used 生成器(如果工作区已恢复,则包括在上一个会话中使用的生成器):如果未使用生成器它选择"default"
。
值
.Random.seed
是 integer
向量,其第一个元素编码 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
(最好使用 kind
和 normal.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 Random.user 用户提供的随机数生成
- R RdUtils 用于处理 Rd 文件的实用程序
- R Rhome 返回 R 主目录
- R Recall 递归调用
- R Round 数字四舍五入
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
- R rank 样本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 将文本推回连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R invisible 将打印模式更改为不可见
- R noquote “无引号”字符串打印类
- R warning 警告信息
- R rapply 递归地将函数应用于列表
- R basename 操作文件路径
- R with 评估数据环境中的表达式
- R formals 访问和操纵形式参数
- R icuSetCollate 按 ICU 设置整理
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Random Number Generation。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。