Здесь есть две вещи.
- Умножение двух
int
вместе может привести к числу, большему 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;
}