當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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