番石榴 - 如何使用Range生成随机数?

时间:2014-07-02 15:23:40

标签: java random guava

Google的Guava库提供了一个名为Range的优秀课程,它有许多有用的方法,如greaterThan(x)open(x,y)等。我想知道是否有任何方法应用这种方法在Range

中生成一个随机数

2 个答案:

答案 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"会更好。