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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。