生成随机布尔向量的最快方法

11

给定一个概率向量p,如何快速生成一个与p长度相同且具有独立元素的随机布尔向量x,使得对于每个ix[i]==TRUE的概率为p[i]

具体而言,是否有比这些方法更快的方式?

p <- rep(0.5,10e6)

system.time(runif(length(p)) < p)
   user  system elapsed 
   0.36    0.02    0.37 

system.time(rbinom(length(p),1,p)>0)
   user  system elapsed 
   1.14    0.04    1.17 
2个回答

15

使用sample 函数,我的机器速度更快:

system.time(runif(length(p)) < p)
    user  system elapsed 
    0.315   0.002   0.318 
system.time(sample(c(TRUE,FALSE), 10e6, TRUE))
    user  system elapsed 
    0.2     0.0     0.2 

1
p <- rep(0.5,10e6)
microbenchmark(runif(length(p)) < p,
               sample.int(n=10,size=length(p),replace=TRUE) < p*10+1,
               times=10)

给出以下结果。
expr                   min       lq     mean   median       uq      max neval
runif(length(p)) < p   465.7474 467.6487 477.6264 469.5444 477.7114 541.8130    10
sample.int(n = 10,     266.1194 268.7164 311.0995 307.0160 333.6954 418.2309    10

对于低概率 p,您可能需要将sample函数中的整数更改为大于10的数字,并且为p*10+1

让我们检查这两个函数是否给出相同的结果。

set.seed(1234)
p=c(0.1,0.5)
sample_matrix=matrix(NA_real_,nrow=1e6,ncol=length(p))

for (i in 1:nrow(sample_matrix)) sample_matrix[i,]=(runif(length(p)) < p)
colSums(sample_matrix)/nrow(sample_matrix)
#[1] 0.100026 0.500340
for (i in 1:nrow(sample_matrix)) sample_matrix[i,]=(sample.int(n=10,size=length(p),replace=TRUE) < p*10+1)
colSums(sample_matrix)/nrow(sample_matrix)
#[1] 0.100535 0.499451

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接