【问题标题】:Fastest way to generate random boolean vector生成随机布尔向量的最快方法
【发布时间】:2015-12-29 10:54:15
【问题描述】:

给定一个概率向量p,有什么方法可以快速生成一个随机布尔向量x,其长度与p 相同,并且具有独立元素,例如x[i]==TRUE,每个@ 的概率为p[i] 987654326@?

具体来说,有没有比这些更快的方法?:

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 

【问题讨论】:

    标签: r random


    【解决方案1】:

    在我的机器上使用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 
    

    【讨论】:

      【解决方案2】:
      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,您可能希望将10sample 函数和p*10+1 更改为比10 更大的整数。

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

      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
      

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 2010-10-26
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 2017-09-05
        • 2015-08-28
        • 2016-05-23
        相关资源
        最近更新 更多