0

Java Random возвращает отрицательные числа

12

У меня возникла проблема с классом 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 ответ(ов)

0

Проблема с использованием 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);

Этот способ гарантирует, что вы получите только положительные числа, избегая проблем с переполнением.

0

Посмотрите документацию для java.util.Random:

http://download.oracle.com/javase/6/docs/api/java/util/Random.html

Вы пытаетесь получить случайные числа от 0 до 28? Если да, то вам нужно использовать метод nextInt(int), как уже упоминалось ранее. Начальное значение (seed) не влияет на диапазон возможных значений или их относительную вероятность.

0

Согласно документации (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 будет храниться положительное значение.

0

Ваш код содержит небольшую ошибку в обращении к методу генерации случайного числа. Правильная форма будет выглядеть следующим образом:

int randomNumber = new Random().Next(10);

Этот код вернет случайное число в диапазоне от 0 до 9. Метод Next(10) создает случайное число, которое может быть равно 0, 1, 2, ..., 9, исключая 10.

0

Если вам нужно работать с числами, которые могут иметь отрицательные значения, вы можете автоматически преобразовать их в положительные с помощью условного оператора, умножив значение на -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, если это минимально возможное целое число). Если число положительное, то оно остается без изменений.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь