首页 > 解决方案 > `Random.ints(origin, bound)`、`.longs(origin, bound)`等的API是否缺少功能?

问题描述

在我看来,当您创建或使用java.util.Random类的边界时Integer.MAX_VALUE,不可能包含随机值。Long.MAX_VALUEIntStreamLongStream

这似乎是一种令人讨厌的疏忽。我可以理解为什么他们试图与.doubles()版本保持一致,但它会尝试获取可能包含最大值的随机ints 或longs 流(但显然不是全部值范围,因为有一些方法可以这样做)比它需要的复杂得多。

我是否遗漏了什么,或者这在其他地方已经讨论过了?

标签: javarandomjava-stream

解决方案


你是对的。javadoc 声明上限是独占的。这意味着您不能使用ints(lower, upper)来获取包含Integer.MAX_VALUE.

理由?

这可能是设计人员没有考虑以1开头的边缘情况,或者他们认为不值得“修复”使 API 复杂化。

请注意,Random.nextInt(bound)有同样的问题,所以这个缺点Random从 Java 1.2 开始就存在了。因此,另一种可能是设计者在添加ints(...)andlongs(...)方法时就意识到了缺点,但决定不解决它,因为这会导致与旧方法的尴尬不一致。

1 - 这不太可能,IMO。Java 团队是/是聪明人。从源代码中可以清楚地看出他们现在很清楚这一点。


无论如何......如果您需要范围包括MAX_VALUEs 的随机数流,您可以使用无参数重载(ints()longs())并过滤流。或者,您可以滚动自己的流。


推荐阅读