这里有两件事在起作用。
- 将两个
ints 相乘会得到一个大于Integer.MAX_VALUE (2147483647) 的数字,它会环绕为负数。
- 对正数和负数应用模运算符会产生负数。
您需要考虑在给定边缘情况值(例如非常大的整数或负数)的情况下,您希望此函数如何工作。
例如,generateNo(-100, 50) 应该产生什么?
您可能希望在进行取模之前确保您的值是正数,如下所示:
Math.abs(randomNo * value) % 256
然而,这实际上有一个非常有趣的边缘情况,Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE 因为它溢出了。
改为在结果上使用Math.abs:
Math.abs((randomNo * value) % 256)
我还会对这个函数提出一些一般性的批评。这些名称并不能真正解释它的作用。为什么generateNo?毫无疑问,有很多方法可以生成一个数字。我会建议一个更具体的名称。
参数randomNo 和value 也有问题。为什么generateNo 关心第一个参数是否是随机的?
更清楚地指定您想要发生的事情,并使用描述这些事情的名称,可能会更容易思考。
我还建议,在遇到此类问题时,分解这些步骤,以便您了解发生了什么。比如:
private static int generateNo(int randomNo, int value){
final int product = randomNo * value;
final int result = product % 256;
// Breakpoint or System.out.println here, to understand the values...
return result;
}