多次生成随机向量,直到条件完成

时间:2016-01-03 16:37:35

标签: r random vector

我有一个向量x =(1,2,3,4,... 20),我想从这个向量生成带有5个元素的向量(元素可以重复),直到显示出所有元素第一个向量至少一次。然后我必须用直方图来表示数据。知道我该怎么办? 提前致谢

3 个答案:

答案 0 :(得分:3)

while循环似乎是一个很好的方式去这里。该解决方案使用矩阵来捕获样本。每个样本都是一行。如果您愿意,这样可以更轻松地对每个样本执行其他操作。

set.seed(123)  

base_v <- 1:20

#empty matrix to put samples in
mydat <- matrix(nrow=0,ncol=5)

while(!all(base_v %in% mydat)){
  mydat <- rbind(mydat, sample(base_v,size=5,replace=T))
}

#then making the histogram is trivial
hist(mydat)

答案 1 :(得分:1)

我认为这就是你想要的:

x <- 1:20
s <- integer(0)
while (! all(x %in% s)) {
  s <- c(s, sample(x, 5, TRUE))
}

向量s将包含从x中提取的所有值。我相信你可以自己制作直方图。

逐行说明:

  • x <- 1:20 - 使用数字1..20
  • 初始化向量x
  • s <- integer(0) - 初始化将存储所有结果的空向量s
  • x %in% s - 对于x中的每个元素,检查它是否出现在s中的任何位置并返回布尔(逻辑)值
  • all(…) - 如果参数向量中的所有元素都是TRUE,则返回TRUE;否则返回FALSE(如果至少有一个 TRUE)
  • ! - 逻辑否定
  • while - 只要条件评估为TRUE,就会重复循环
  • 总结:只要x中至少有一个元素不在s中,就可以在循环体中执行代码
  • sample(x, 5, TRUE) - 从向量x中绘制五个元素,允许重复
  • s <- c(s, sample(x, 5, TRUE)) - 将绘制的值连接到向量s并将此新向量分配回s

答案 2 :(得分:0)

您可以通过替换获得五个元素的样本(如果您不想更换抽样,可以将其设置为false):

x <- seq(1:20)
shown <- rep(0, 20)
while (!all(shown > 0)) {
  s <- sample(x, 5, replace = TRUE)
  shown[s] <- shown[s] + 1
}
hist(shown)