跳轉到內容

R 程式設計/隨機數生成

來自 Wikibooks,開放書籍,開放世界

隨機數生成器

[編輯 | 編輯原始碼]

在很大程度上,計算機是確定性的,因此不是可靠的大量隨機值的來源。一般情況下,使用偽隨機數生成器。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(分位數函式),則可以透過在標準均勻分佈中進行取樣,然後使用 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 

重要性抽樣

[編輯 | 編輯原始碼]

Metropolis 演算法

[編輯 | 編輯原始碼]

Gibbs 演算法

[編輯 | 編輯原始碼]

準隨機數

[編輯 | 編輯原始碼]

有時需要生成準隨機序列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])

參考文獻

[編輯 | 編輯原始碼]


上一篇:機率分佈 索引 下一篇:控制結構
華夏公益教科書