我正在尝试找到一种方法,使用ThreadLocalRandom
从提供的不同范围的列表中获取随机值,然后从方法中返回该随机值。我一直在尝试不同的方法,但运气不佳。
我已经尝试过了:
private static final Long[][] values = {
{ 233L, 333L },
{ 377L, 477L },
{ 610L, 710L }
};
// This isn't correct
long randomValue = ThreadLocalRandom.current().nextLong(values[0][0]);
但是我无法弄清楚如何从特定范围内获取随机值,因此以为我尝试使用Map
方法,我尝试创建一个整数映射和多头列表:< / p>
private static Map<Integer, List<Long>> mapValues = new HashMap<>();
{{233L, 333L}, {377L, 477L}, {610L, 710L}} // ranges I want
我不确定如何将这些值范围存储到地图中。
我尝试添加值,例如:
// Need to get the other value for the range in here, in this case 333L
map.put(1, 233L);
我不确定如何将333L添加到列表中,我已经搜索并尝试了多种方法,但始终会遇到错误,例如:找到'long',必需的列表
我希望Map中的Integer是关联范围的ID,例如233L-333L为1,这样我就可以告诉它,首先从Map中获得一个随机的Int密钥,例如1,然后然后使用ThreadLocalRandom.current().nextLong(origin, bound)
(原点为233L,界限为333L),然后返回在233L-333L范围内的随机值。
我不确定这是否可行,或者我只是以错误的方式进行操作-任何指导/帮助都将受到赞赏!
答案 0 :(得分:1)
int range = ThreadLocalRandom.current().nextInt(3);
long randomValue = ThreadLocalRandom.current().nextLong(values[range][0],values[range][1]);
这将与您首先尝试的阵列解决方案一起使用。首先选择范围,然后获得随机值。
答案 1 :(得分:1)
这很简单。您的long[][]
会很好。
首先,选择一个随机索引,然后在values[index][0]
和values[index][1]
1 之间选择一个长整数。
long[][] values = {
{ 233L, 333L },
{ 377L, 477L },
{ 610L, 710L }
};
// Select a random index
int index = ThreadLocalRandom.current().nextInt(0, values.length);
// Determine lower and upper bounds
long min = values[index][0];
long max = values[index][1];
long rnd = ThreadLocalRandom.current().nextLong(min, max);
当然,您也可以abstract it away进入一些方便的课程。
请注意,要使值的分布均匀,所有范围都必须具有相同的大小(在您的代码中似乎是这种情况)。
但是,如果要在分布必须保持均匀的同时支持不同范围,则需要另一种方法。
我们可以计算一个随机数,并将可能值的总数作为上限。然后,我们可以检查要在哪个“存储桶”中检索该值。
Here is a working example。为了测试据说是均匀的分布,随机数被生成一百万次。如您所见,每个值大约发生200,000次。
1在我的示例中,上限为排他性。这与Java标准库中的许多方法(例如ThreadLocalRandom.nextLong(origin, bound)
或LongStream.range(long start, long end)
)是一致的。
答案 2 :(得分:0)
最简单的方法就是最直接的方法。
private static final long[][] values = { { 233L, 333L
}, { 377L, 477L
}, { 610L, 710L
}
};
public static void main(String[] args) {
for (long v[] : values) {
long low = v[0];
long high = v[1];
System.out.println("Between " + low + " and " + high + " -> "
+ getRandom(low, high));
}
}
public static long getRandom(long low, long high) {
// add 1 to high to make range inclusive
return ThreadLocalRandom.current().nextLong(low, high + 1);
}