【发布时间】:2020-10-27 17:42:15
【问题描述】:
我想编写一个函数,对 n 个彩票的样本进行采样,其中 6 个数字从 1 到 45 不带替换。但是,我需要有效地执行此操作,这意味着没有循环或类似循环的函数。 (我猜 Rcpp 也可以,但我更喜欢基本 R 中的矢量化解决方案)
无限制地求解:
lottery_inef <- function(n){
t(replicate(n,
sample(1:45, 6)))
}
所以在这里我得到一个矩阵,其中每一行对应一张彩票。现在,如果我想模拟数百万张彩票,这会变得很慢,因此我对矢量化解决方案很感兴趣。
我的想法是:
lottery_ef <- function(n){
m <- matrix(sample(1:45, n*6, replace = TRUE), ncol = 6)
# somehow subset the matrix without a loop to remove all the
# rows that have non-unique values as in the lottery we can only draw each number once
}
对于高效的版本,在没有循环或 apply() 的情况下,我有点迷失了。如果有人能解决这个子集问题或指出一个完全不同的方向来引导我找到解决方案,我将不胜感激。
【问题讨论】:
-
您能否将所有可能的组合生成为矩阵的行,然后仅对行号进行采样(在这种情况下为 1-~810 万)?生成完整集需要几秒钟,但索引子集很快。
-
@mrhellmann 好主意,我刚试过这个,如果我创建矩阵大约需要 9 秒,采样一百万行只需几毫秒。如果你想写这个作为答案,我很乐意接受。