Java Random возвращает отрицательные числа
У меня возникла проблема с классом Random
в Java. Вот что я делаю:
Random rng = new Random(seed); // seed == 29 в этом примере
String ss = "";
for (int i = 0; i < 10; i++) {
int s = rng.nextInt();
ss += Integer.toString(s);
ss += "\n";
}
Что я получаю в результате:
-1169335537
-2076183625
1478047223
1914482305
722089687
2094672350
-1234724057
-1614953544
-321574001
1000360613
По тому, что я прочитал, этот метод должен возвращать только положительные числа.
Может показаться, что это маловероятно, но может ли это как-то быть связано с тем, что я работаю на 64-битной машине под Windows 7 64-bit?
Любая помощь была бы очень кстати, мне нужно завершить это для задания, которое нужно сдать сегодня!
5 ответ(ов)
Проблема с использованием Math.abs(rand.nextInt())
заключается в том, что метод nextInt()
генерирует числа в диапазоне от Integer.MIN_VALUE
до Integer.MAX_VALUE
, и когда вы применяете Math.abs()
, существует вероятность возникновения проблемы с переполнением.
Дело в том, что Integer.MIN_VALUE
(который равен -231) не имеет положительного эквивалента в диапазоне целых чисел, так как максимальное значение для типа int
— это 231 - 1. Поэтому, если nextInt()
возвращает Integer.MIN_VALUE
, то Math.abs(Integer.MIN_VALUE)
все равно вернёт Integer.MIN_VALUE
, что приведёт к нежелательному поведению.
Таким образом, если вы хотите получить чисто положительные числа, лучше использовать что-то вроде следующего кода:
int positiveRandomNumber = rand.nextInt(Integer.MAX_VALUE + 1);
Этот способ гарантирует, что вы получите только положительные числа, избегая проблем с переполнением.
Посмотрите документацию для java.util.Random:
http://download.oracle.com/javase/6/docs/api/java/util/Random.html
Вы пытаетесь получить случайные числа от 0 до 28? Если да, то вам нужно использовать метод nextInt(int), как уже упоминалось ранее. Начальное значение (seed) не влияет на диапазон возможных значений или их относительную вероятность.
Согласно документации (http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt()), метод nextInt()
возвращает следующее псевдослучайное целое значение, равномерно распределенное в последовательности данного генератора случайных чисел. Общий контракт метода nextInt
заключается в том, что одно целое значение генерируется псевдослучайным образом и возвращается. Все 2^32 возможных целых значения производятся с (приблизительно) равной вероятностью.
Если вам нужно преобразовать полученное значение так, чтобы оно всегда было положительным, вы можете просто умножить его на -1, если оно отрицательное. Однако, имейте в виду, что при этом вы будете всегда возвращать положительные числа, в то время как nextInt()
может выдавать отрицательные значения. Лучше воспользоваться методом Math.abs()
, чтобы избежать нежелательных эффектов, например:
Random random = new Random();
int value = random.nextInt();
int positiveValue = Math.abs(value);
Таким образом, в positiveValue
будет храниться положительное значение.
Ваш код содержит небольшую ошибку в обращении к методу генерации случайного числа. Правильная форма будет выглядеть следующим образом:
int randomNumber = new Random().Next(10);
Этот код вернет случайное число в диапазоне от 0 до 9. Метод Next(10)
создает случайное число, которое может быть равно 0, 1, 2, ..., 9, исключая 10.
Если вам нужно работать с числами, которые могут иметь отрицательные значения, вы можете автоматически преобразовать их в положительные с помощью условного оператора, умножив значение на -1. Точно так же вы можете преобразовать положительные числа в отрицательные, используя тот же метод.
Вот примеры:
int a = -5;
a = a < 0 ? (a == -2147483648 ? 0 : -a)
: a;
int b = -2147483648;
b = b < 0 ? (b == -2147483648 ? 0 : -b)
: b;
int c = 12345;
c = c < 0 ? (c == -2147483648 ? 0 : -c)
: c;
В этих примерах мы используем тернарный оператор для проверки, меньше ли число нуля. Если оно отрицательное, мы преобразуем его в положительное значение (или в 0, если это минимально возможное целое число). Если число положительное, то оно остается без изменений.
Как сгенерировать случайные целые числа в определенном диапазоне на Java?
Почему этот код с использованием случайных строк выводит "hello world"?
Как сгенерировать случайную алфавитно-цифровую строку
Получение случайных чисел в Java
Как объявить массив в одну строку?