java - `Random.ints(origin, bound)`、`.longs(origin, bound)`等的API是否缺少功能?
问题描述
在我看来,当您创建或使用java.util.Random类的边界时Integer.MAX_VALUE
,不可能包含随机值。Long.MAX_VALUE
IntStream
LongStream
这似乎是一种令人讨厌的疏忽。我可以理解为什么他们试图与.doubles()
版本保持一致,但它会尝试获取可能包含最大值的随机int
s 或long
s 流(但显然不是全部值范围,因为有一些方法可以这样做)比它需要的复杂得多。
我是否遗漏了什么,或者这在其他地方已经讨论过了?
解决方案
你是对的。javadoc 声明上限是独占的。这意味着您不能使用ints(lower, upper)
来获取包含Integer.MAX_VALUE
.
理由?
这可能是设计人员没有考虑以1开头的边缘情况,或者他们认为不值得“修复”使 API 复杂化。
请注意,Random.nextInt(bound)
有同样的问题,所以这个缺点Random
从 Java 1.2 开始就存在了。因此,另一种可能是设计者在添加ints(...)
andlongs(...)
方法时就意识到了缺点,但决定不解决它,因为这会导致与旧方法的尴尬不一致。
1 - 这不太可能,IMO。Java 团队是/是聪明人。从源代码中可以清楚地看出他们现在很清楚这一点。
无论如何......如果您需要范围包括MAX_VALUE
s 的随机数流,您可以使用无参数重载(ints()
和longs()
)并过滤流。或者,您可以滚动自己的流。
推荐阅读
- c# - WebAPI(aspx项目)程序启动时如何从线程运行HttpListener
- f# - Microsoft F# 文档中的示例无法编译
- php - 用双引号将 PHP 中的所有文本括起来不会导致预期的行为,并且会添加太多引号
- python - 在 Matplotlib 中更改颜色条缩放
- javascript - 如何处理多个 API 调用
- mysql - 数据导入 INSERT INTO 的问题 - MySQL
- powershell - 如何结合这两个命令
- css - 手机版CSS其他图片
- android - Android 构建失败回复:评估项目“:unimodules-react-native-adapter”时出现问题
- flutter - Visual Studio Code 自动热重载文件更改