Некорректная генерация случайных чисел при помощи Random на Java

Рейтинг: 2Ответов: 2Опубликовано: 11.07.2023

Доброго времени суток каждому, кто прочтёт данное сообщение! Я относительно недавно(по вселенским меркам) очередной раз начал изучать Java по средствам задач. И в одной из них мне необходимо сгенерировать 20 случайных чисел в указанном диапазоне. Диапазон вводит пользователь. До этого я без проблем пользовался такой формулой:

int max = 10;
int min = -510;
int sum = max - min;
int result = random.nextInt(sum) - min;

Тем самым всегда получая псевдо случайное число в заданном мною диапазоне. Но потом в моей жизни произошло это:

package org.example.newstart.task.loops;

import java.util.Random;
import java.util.Scanner;

public class For_2 {
    static Scanner enter = new Scanner(System.in);

    public static void main(String[] args) {
        Random random = new Random();
        System.out.println("При помощи введённых вами 2-х чисел обозначьте диапазон для генерации 20 случайных чисел");
        int oneNumber = 10;
        int twoNumber = -510;
        int sum = oneNumber - twoNumber;

        for (int i = 1; i < 21; i++) {
            int result = random.nextInt(sum);
            int i1 = result - twoNumber;

            System.out.println(i1 + " - Сгенерированное число № - " + i);
        }
    }
}

И данный класс стал генерировать числа выходящие далеко за желаемый мною диапазон.
И я никак не могу понять что в моём идеальном шаблоне пошло не так.

Ответы

▲ 4Принят

Ну вообще-то у вас формула неправильная, min и twonumber в конце должны быть с плюсом.

И так, на всякий случай - разность суммой лучше не называть

int diff = max - min;
int result = random.nextInt(diff) + min;
▲ 2

Для генерации потока псевдослучайных целых чисел в заданном диапазоне лучше воспользоваться стандартным методом Random::ints(long streamSize, int randomNumberOrigin, int randomNumberBound) (не включая максимальное значение).
Этот метод был добавлен в Java 8 десять лет назад, и позволяет избежать изобретения велосипедов.

// получить массив из 20 случайных чисел в диапазоне [-510 .. 10)
int[] arr = new Random().ints(20, -510, 10).toArray();

// просто распечатать случайные числа
new Random().ints(20, -510, 10).forEach(System.out::println);

Аналогично, для генерации псевдослучайных целых чисел можно воспользоваться классом ThreadLocalRandom и его методом nextInt(int origin, int bound).
Данный метод существует ещё раньше со времён Java 1.7 и не требует знания Stream API:

ThreadLocalRandom r = ThreadLocalRandom.current();
for (int i = 1; i <= 20; i++) {
    System.out.println(i + "-е случайное число: " + r.nextInt(-510, 10));
}