Google的Guava库提供了一个名为Range
的优秀课程,它有许多有用的方法,如greaterThan(x)
,open(x,y)
等。我想知道是否有任何方法应用这种方法在Range
?
答案 0 :(得分:7)
我不建议在此基本应用程序中使用范围。
最简单的方法是使用已经实现的Random类。
以下是如何使用该类:
获取任意值的随机整数:
Random r = new Random();
r.nextInt();
获取min x,max y:
范围内的随机整数Random r = new Random();
r.nextInt(y - x) + x;
这是获取范围内随机数的最基本方法。 我打赌在范围类中有一个getMin和getMax方法,所以对x和y使用它。
此外,如果您想要一个大于x的最小值的随机数,只需执行:
Random r = new Random();
Math.abs(r.nextInt().nextInt()) + x;
^上面的代码生成任何正整数,x确保最小值。
-OR -
nextInt(Integer.MAX_VALUE - (x + 1)) + (x + 1)
- 由ColinD建议 希望这可以帮助。 -classic
答案 1 :(得分:1)
就像路易斯所说,没有内置的方法可以做到这一点,但有一些相当简单的选择。请注意,我们必须假设所有Range
个实例都在两边都有界限 - 您无法从无界范围或非离散范围中选择随机值(例如(-∞..0]
)。
最容易实施的解决方案是简单地将Range
转换为ContiguousSet
,您可以select a random value in linear time从中Range<Integer>
。这有利于任何离散类型,而不仅仅是public static C random(Range<C> range, DiscreteDomain<C> domain) {
Set<C> set = ContiguousSet.create(range, domain);
int index = random.nextInt(set.size());
return Iterables.get(set, index);
}
。
Range
当然,恒定时间会更好,特别是对于大范围。 Canonicalizing f(y-x) + x
首先减少了我们必须处理的案例数量,我们可以使用JClassic建议的public static int random(Range<Integer> range) {
checkArgument(range.hasLowerBound() && range.hasUpperBound(),
"Cannot select a random element from unbounded range %s", range);
Range<Integer> canonical = range.canonical(DiscreteDomain.integers());
return random.nextInt(canonical.upperEndpoint() - canonical.lowerEndpoint())
+ canonical.lowerEndpoint();
}
模式。
Long
您可以使用Random.nextLong()
轻松扩展此Random.nextLong()
(但请注意,long
无法返回所有SecureRandom
值,因此"scalac HelloWorld.scala"
会更好。