为什么没有nextDouble(),nextFloat()和nextLong()接受java.util.Random

时间:2017-05-31 07:24:39

标签: java random

我正在阅读java.util.Random课程,并注意到没有nextDouble()nextFloat()nextLong()可以接受绑定

有许多方法可以完成like this

但我的问题是为什么java没有向我们提供接受绑定的nextInt(int n)等必需方法。

他们没有提供这些方法的具体原因吗?

2 个答案:

答案 0 :(得分:4)

一个好的API总是试图提供用户完成其工作所需的基本元素。

EditText只是一个可能的实现。如果您需要其他发行版怎么办?

换句话说:随机API可能会尝试预测所有潜在的使用模式,但这会非常膨胀整个API。相反,设计师选择一个非常小的界面 - 但是你拥有了构建自己的东西所需的所有元素。

事情是:最后,这是创建Random类的人的设计风格决定。而且往往可以通过许多不同的方式解决问题。因此,你不应该对这里选择的解决方案得出深刻的结论。

答案 1 :(得分:0)

查看来自Random.java的代码(在jdk 8中)有两个突出的陈述。

 * The algorithm is slightly tricky.  It rejects values that would result
 * in an uneven distribution (due to the fact that 2^31 is not divisible
 * by n). The probability of a value being rejected depends on n.

 * Linear congruential pseudo-random number generators such as the one
 * implemented by this class are known to have short periods in the
 * sequence of values of their low-order bits.

如果不是随机数生成方面的专家(他们将其称为随机数生成),很明显该算法正在努力更好地返回"随机数& #34;数字比你只是next() % bound,在随机性方面(也可能是效率)。

还有便利因素,但鉴于代码中的注释,这似乎并不是主要原因。