Algorithm 生成随机数,但不循环排除多个范围

Algorithm 生成随机数,但不循环排除多个范围,algorithm,pseudocode,Algorithm,Pseudocode,我在寻找一种数学方法,在[a,b]之间生成一个随机数,在[c,d,[e,f,[g,h]等处有洞,其中a

我在寻找一种数学方法,在[a,b]之间生成一个随机数,在[c,d,[e,f,[g,h]等处有洞,其中a 我在这里找到了许多例子,说明了如果缺少一个范围,如何使算法工作,但似乎找不到一种可以推广到多个范围的空间/时间效率方法。我在这里的意思是:

a、 列出所有可能的范围并从中进行选择:不适合大范围

b、 生成一个随机数并检查它是否是其中一个范围,否则重试:运行时的无界项

一些突出的测试用例可能是:

generate_random(start=0, end=100, exclude: [(2,50),(51, 100)])
generate_random(start=0, end=1e16, exclude: [(1e6,1e7),(1e3, 1e4)])
以下是我发现的一些例子:


你想选a,c-1,d,e-1,x,b-1中的任何一个


因此N=c-a+e-d+…+b-x。在0..N-1中选择随机r。如果r下面是@Chris Hall答案中上述算法的Python实现

def random_exclude(low: int, high: int, exclude: List[Tuple[int]]) -> int:
  N = -low+sum([(l-h) for l,h in exclude])+high
  r = np.random.randint(low, N)
  for l, h in exclude:
    if r < l:
      return r
    else:
      r+=h
  return r

如果有M个范围,其中M是大的,那么我们有一个线性搜索OM来确定r的偏移量。通过范围进行特殊的二进制搜索会更快。这更有意义,好吧,现在如果我想将其扩展到二维,那么该怎么办。也就是说,我的原始目标是在预设宽度和宽度的图像中找到未占用的边界框高度这里出现的问题是,我有更多的限制,如果我不能在一个特定的范围内制作一个特定高度的盒子,那么这个盒子也应该被排除。@Adithya:我猜你的意思是,对于每个范围a..c-1,d..e-1,等等,对于x,你有一组不同的y范围?在选择x的过程中,你需要注意哪些是ch范围x在-rx=0表示a..c-1,rx=1表示d..e-1,等等。然后根据rx范围集选择一个y。@ChrisHall有意义的是,有没有一种干净的方法可以用与上面N的计算类似的方式来概括它,或者我需要维护某种查找表来跟踪我对y的约束是什么t到x。我还将在下面发布我自己的解决方案,我的一些python代码实现了上面的内容。@ChrisHall我意识到我前面的问题可能超出了上述问题的范围,因此我总结了我较新的尝试,并提出了一个新问题: