R 如何将间隔随机划分为长度相等的非重叠间隔容器

R 如何将间隔随机划分为长度相等的非重叠间隔容器,r,random,bins,R,Random,Bins,我有一个间隔,例如从1到671。我想把它分成5个长度为50但间隔最小为51的随机非重叠箱子 interval <- 1:671 (example, it does not need to be 671) interval我不知道这是否具有所需的随机性: interval <- 1:671 set.seed(42) repeat { #rejection sampling int <- list(interval) s <- integer(5) * NA

我有一个间隔,例如从1到671。我想把它分成5个长度为50但间隔最小为51的随机非重叠箱子

interval <- 1:671  (example, it does not need to be 671)

interval我不知道这是否具有所需的随机性:

interval <- 1:671 

set.seed(42)

repeat { #rejection sampling
  int <- list(interval)
  s <- integer(5) * NA

  for (i in 1:5) {
    #sample an interval from the list
    sel <- sample(length(int), 1)
    isel <- int[[sel]]

    #sample start value
    s[[i]] <- sample(head(isel,-49), 1)

    #remove sampled values from interval
    sp <-
      split(isel, findInterval(isel, c(0, s[[i]], s[[i]] + 50, Inf)))
    if (s[[i]] > isel[1] &&
        s[[i]] < length(isel) - 49)
      sp <- sp[-2]
    else
      if (s[[i]] == isel[1])
        sp <- sp[-1]
    else
      if (s[[i]] == length(isel) - 49)
        sp <- head(sp,-1)
    sp <- sp[lengths(sp) >= 50]
    int <- c(sp, int[-sel])

    #break out of for loop 
    #if not enough intervals of sufficient length left
    if (length(int) < 1) break
  }
  if (!anyNA(s)) break
}

s
#[1] 321  74 245 170 441

library(ggplot2)
ggplot(data.frame(s = s, e = s + 49), aes(x = s, xend = e, y = 0, yend = 0)) +
  geom_segment(size = 3) +
  theme_minimal() +
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        panel.grid.major.y = element_blank()) +
  xlab("") + ylab("")

interval如果我正确理解了您的问题,您需要5个部分的时间间隔,长度为50,最小距离为51

所以你的随机性是指每个距离比51大多少

这意味着您要计算实际要分配的空间

intervalLength <- 671
nBins <- 5
binWidth <- 50
binMinDistance <- 51

spaceToDistribute <- intervalLength - (nBins * binWidth + (nBins - 1) * binMinDistance)

intervalLength类似的方法可能会奏效:

set.seed(111)

n_bins <- 5
bl <- 50
spacing <- 51

start <- 1
end <- 671


end_int <- end - n_bins*bl - (n_bins-1)*spacing
first_bin_start <- sample(start:end_int, 1)
first_bin_end <- first_bin_start + bl
avail_spacing <- end - first_bin_end - (n_bins-1)*bl - (n_bins-1)*spacing

sp <- c()
for (i in 1:(n_bins-1)){
  end <- sample(1:avail_spacing, 1)
  sp <- c(sp, end)
  avail_spacing <- avail_spacing - end
}


bin_start <- c(first_bin_start, first_bin_start + cumsum(spacing + bl + sp))
bin_end <- bin_start + bl

df <- data.frame(bin = 1:n_bins,
                 bin_start = bin_start,
                 bin_end = bin_end)

df
set.seed(111)

n\u您说的
垃圾箱长度为50,但间距至少为51,是哪一个?为什么第一个箱子不从1开始?我的意思是每个箱子的长度为50(例如1,2,3,4…50),但是下一个箱子不应该早于101开始,但不一定是在101开始,而是随机的。是的,第一个垃圾箱可以从1开始,但也不一定要在1。这并不容易。它必须是完全随机的吗?是的,这是我寻找的那种随机性。很好,谢谢,很好,非常感谢。只有这行有微小的错误,应该有startoffin而不是startoffins:result
distances <- diff(floor(c(0, sort(runif(nBins))) * spaceToDistribute))
startOfBin <- cumsum(distances) + (0:(nBins-1)) * 101
result <- data.frame(bin = 1:nBins, startOfBin = startOfBin, endOfBin = startOfBin + 49)
set.seed(111)

n_bins <- 5
bl <- 50
spacing <- 51

start <- 1
end <- 671


end_int <- end - n_bins*bl - (n_bins-1)*spacing
first_bin_start <- sample(start:end_int, 1)
first_bin_end <- first_bin_start + bl
avail_spacing <- end - first_bin_end - (n_bins-1)*bl - (n_bins-1)*spacing

sp <- c()
for (i in 1:(n_bins-1)){
  end <- sample(1:avail_spacing, 1)
  sp <- c(sp, end)
  avail_spacing <- avail_spacing - end
}


bin_start <- c(first_bin_start, first_bin_start + cumsum(spacing + bl + sp))
bin_end <- bin_start + bl

df <- data.frame(bin = 1:n_bins,
                 bin_start = bin_start,
                 bin_end = bin_end)

df