我有一个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-total)中选择一个随机值
将随机值视为索引,并逐步找到该索引对应的范围
根据包含所述索引的范围起点对随机数进行偏移。

10-04 10:49