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