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 代码并在自己的程序中使用它。