由于样本单元是独立的(后面单元的概率不依赖于前面单元的概率,在这种情况下始终为 0.5),我们可以使用另一种策略。我们可以先绘制一个大(r)样本,然后在满足我们所需条件的点处将其切断,而不是增加样本:
makeSample <- function(n=20) {
fruit <- c("apple", "orange")
full.sample <- sample(x = fruit, size = n, replace = TRUE)
apples <- cumsum(full.sample == "apple")
oranges <- cumsum(full.sample == "orange")
diff <- oranges - apples
exit.position <- match(2L, diff)
if (is.na(exit.position))
stop("The condition specified not achieved, try again or increase N")
result <- head(full.sample, exit.position)
return(result)
}
功能真的很简单。它绘制所需长度的大(超集)样本,默认值为 20。创建两个逻辑向量(full.sample == "orange"
和full.sample=="apple"
),每个连续步骤中的苹果和橙子的数量用 计算cumsum()
,因为 TRUE 等于 1(存在水果)和 FALSE 为 0(没有水果)。然后我们取这些向量之间的差异,看看在任何时候差异是否满足我们的条件。如果是,该函数将返回您最初想要的结果样本。如果没有,它会抛出错误,敦促您重试或增加 N。
这在更大的样本上应该更有效,并且可以很容易地调整到更复杂的条件。当 N 较小时,您可能不会得到结果,而不是循环解决方案。随着 N 的增加,您的机会接近 1。您可以包装makeSample()
另一个函数,以确保您始终获得结果。