从Java中的范围列表中选择一个随机整数

时间:2012-12-30 06:49:22

标签: java

我有一个Java范围列表

public class Range {
   private int min, max;
   //constructor, getters, setters go here
}

因此,列表可能如下所示

ranges = [[3,9], [18,45], [90,112]]

我需要做以下功能

public int getRandomValueWithinRanges() {
   //returns a value which is contained inside a range inside the ranges ArrayList
}

我该怎么做?这些范围内的每个值应该具有相同的被选择概率,并且应该有效地完成(即,列出范围内的所有值,然后从该列表中随机选择有效)

3 个答案:

答案 0 :(得分:7)

嗯,一种方法:

  1. 总结所有范围(即它们跨越的整数总数)

  2. [0-total)

  3. 中选择一个随机值
  4. 将随机值视为索引并逐步查找此索引对应的范围

  5. 根据包含所述索引的范围开始偏移随机数..

答案 1 :(得分:1)

首先,选择一个随机范围。然后从所选随机范围中选择一个随机整数。

答案 2 :(得分:1)

最佳解决方案取决于您是否可以通过相同的范围列表调用getRandomValueWithinRanges摊销设置费用。

如果你不能摊还,那么@ pst的方法是最好的。

如果可以分期付款,那么有多种方法可以让方法更快; e.g。

  • 构建所有范围元素的数组列表。这样可以提供最快的getRandom...,但设置时间很长,空间开销很大。
  • 构建数据结构以加速随机索引(在@ pst的解决方案中)到值的映射。

应该注意的是,在该范围内简单选择随机范围和随机元素可能会偏向随机数的选择......除非您能够通过加权范围选择或某事来弄清楚如何进行补偿。 / p>