我有一个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
}
我该怎么做?这些范围内的每个值应该具有相同的被选择概率,并且应该有效地完成(即,列出范围内的所有值,然后从该列表中随机选择不有效)
答案 0 :(得分:7)
嗯,一种方法:
总结所有范围(即它们跨越的整数总数)
从[0-total)
将随机值视为索引并逐步查找此索引对应的范围
根据包含所述索引的范围开始偏移随机数..
答案 1 :(得分:1)
首先,选择一个随机范围。然后从所选随机范围中选择一个随机整数。
答案 2 :(得分:1)
最佳解决方案取决于您是否可以通过相同的范围列表调用getRandomValueWithinRanges
来摊销设置费用。
如果你不能摊还,那么@ pst的方法是最好的。
如果可以分期付款,那么有多种方法可以让方法更快; e.g。
getRandom...
,但设置时间很长,空间开销很大。应该注意的是,在该范围内简单选择随机范围和随机元素可能会偏向随机数的选择......除非您能够通过加权范围选择或某事来弄清楚如何进行补偿。 / p>