跳转到内容

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])

参考文献

[编辑 | 编辑源代码]


上一篇:概率分布 索引 下一篇:控制结构
华夏公益教科书