R 程式設計/隨機數生成
外觀
< R 程式設計
在很大程度上,計算機是確定性的,因此不是可靠的大量隨機值的來源。一般情況下,使用偽隨機數生成器。R 中的預設演算法是梅森旋轉器,但也有很多方法。請檢視 RNGkind() 的幫助以瞭解有關隨機數生成器的資訊。
?RNGkind
可以使用真正的隨機數。其中一些收集在 random.org 上 (連結)。random (連結) 包提供了對它們的訪問許可權。
Randu 是一種舊的線性同餘偽隨機數生成器。datasets 包中有一個使用 Randu 生成的資料集。用於生成資料集的函式在該頁面的幫助中。
library("datasets")
?randu
偽隨機數生成器是一種基於稱為“種子”的起點的演算法。如果要對程式進行精確複製,則必須使用 set.seed() 函式指定種子。set.seed 的引數必須是整數。
> set.seed(1) > runif(1) [1] 0.2655087 > set.seed(1) > runif(1) [1] 0.2655087
拋 10 個硬幣
> sample(0:1,10,replace=T) [1] 1 0 0 0 1 0 0 1 1 1
擲 10 個骰子
> sample(1:6,10,replace=T) [1] 4 1 5 3 2 5 5 6 3 2
玩彩票(從 49 個數字中隨機選擇 6 個數字,不放回)
> sample(1:49,6,replace=F) [1] 18 35 29 1 33 11
您可以在多項分佈中進行取樣
>mydat <- sample(1:4,1000,rep=TRUE,prob=c(.2,.3,.2,.3)) >table(mydat)
您可以使用 rnorm、rt 等。
請注意,如果將向量而不是數字作為 rnorm 的引數,R 預設情況下會採用向量的長度,而不是返回錯誤。以下是一個示例
x <- rnorm(10) # Sample a normal random vector set.seed(1) # use the seed z <- rnorm(x) # put a vector instead of a number as an argument of rnorm set.seed(1) # initialize the seed again z2 <- rnorm(length(x)) # sample in a vector with the same length as x plot(z2,z) # check that z and z2 are the same
- 如果知道逆 CDF(分位數函式),則可以透過在標準均勻分佈中進行取樣,然後使用 CDF 進行轉換,來生成隨機變數。
例如,如果要從標準正態分佈中進行模擬,則可以從標準均勻分佈中進行模擬,並使用正態分佈的分位數函式對其進行轉換。
N <- 100 qnorm(runif(N))
這與rnorm()函式給出相同的結果,但計算時間更長
> N <- 10^7 > system.time(qnorm(runif(N))) user system elapsed 1.67 0.00 1.70 > system.time(rnorm(N)) user system elapsed 1.50 0.00 1.51
- 請參閱 Jeff Gill 的程式
- rgs 包 (連結)
有時需要生成準隨機序列。randtoolbox 庫提供了多種準隨機數生成器。
另請參閱sHalton()和QUnif()(sfsmisc).
> library(randtoolbox)
> halton(10, dim = 2, init = TRUE, normal = FALSE, usetime = FALSE)
[,1] [,2]
[1,] 0.5000 0.33333333
[2,] 0.2500 0.66666667
[3,] 0.7500 0.11111111
[4,] 0.1250 0.44444444
[5,] 0.6250 0.77777778
[6,] 0.3750 0.22222222
[7,] 0.8750 0.55555556
[8,] 0.0625 0.88888889
[9,] 0.5625 0.03703704
[10,] 0.3125 0.37037037
可以將 Halton 抽取與標準 R(偽)隨機數生成器進行比較。Halton 抽取更加系統。
>random <- cbind(runif(1000),runif(1000)) >halton <- halton(1000, dim = 2, init = TRUE, normal = FALSE, usetime = FALSE) >par(mfrow=c(2,2)) >plot(halton[,1],halton[,2]) >plot(random[,1],random[,2])
- Revolution Computing 關於偽隨機數的條目
- Statistical Distributions Module Wessa.net 這是一個使用 R 生成隨機數的線上應用程式。您可以訪問 R 程式碼並在自己的程式中使用它。
