【问题标题】:draw randomly with exclusion restrictions排除限制随机抽取
【发布时间】:2017-03-16 00:25:42
【问题描述】:

我想从带有替换的向量中随机抽取 5 个数字:

myvector <- c(1:50)
draws <- sample(myvector,5,replace=F)

但是,要包括一些限制。

排除1:我不想同时画10和11

排除 2:我只想拥有以下 一个:17、18、19、20。

但是在算法开始之前,每个数字都应该有相同的概率被抽中。到目前为止,我的想法违反了这个条件:为排除项分配相同的数字并从中得出:

myvector.wrong <- c(1:9,10,12:17,21:50)
draws.wrong <- sample(myvector.wrong,5,replace=F)
#say we draw a 17:
draws.wrong[1] <- 17
#then replace the 17 with a randomly drawn number from c(17:20)
draws.wrong[draws.wrong==17] <- sample(c(17:20),1)

但是,这意味着与没有限制的数字相比,c(17:20) 中的每个数字现在只有四分之一的机会被抽中。我只希望一旦以与任何其他相同的机会抽取了一个排除项,该机会就会减少(至 0)。我可以将 17 包括四次,但我冒着绘制两次的风险,这正是我想要避免的。

迭代地,这会更容易:在每次抽奖后检查是否抽出了任何排除号码(例如 10),并在再次抽奖之前删除相应的排除号码(10 和 11)。但是,我会执行很多(通常是 50k,有时是 500k)重复这个过程,所以效率是个问题。

有接受者吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    创建一个函数来检查你的条件是否得到满足并采样,直到你得到一个可以使用的向量

    check = function(x){
        if (sum(10:11 %in% x) > 1){
            return(FALSE)
        }
        if (sum(17:20 %in% x) > 1){
            return(FALSE)
        }
        return(TRUE)
    }
    
    a = 10:11
    while(check(a) == FALSE){        
        a = sample(1:50, 5, replace = FALSE)
    }
    

    【讨论】:

    • 感谢您的回答!我也想过这个,但是效率不高,因为我会画出一些我会再次丢弃的组合。另外,R中的循环不应该很慢吗?不过,我真的很喜欢 while 的想法!
    • 50-500k 在不同的运行中。
    • @PeterPan,这是个好问题。不过,我想不出更快的解决方案。祝你好运!
    猜你喜欢
    • 2021-06-18
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多