2015-10-01 4 views
3

Данный вектор p вероятностей, что быстрый способ генерации случайных булева вектора x из той же длины, как p и с независимыми элементами, такими, что x[i]==TRUE с вероятностью p[i] для каждого 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 

ответ

3

Использование функции 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 вам может потребоваться изменить большие целые числа, чем 10 для функции sample и 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 
Смежные вопросы