Почему не работает Math.random() при создании нового объекта?

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

Не могу понять почему при инициализации нового объекта не выпадает рандомное число атрибуту ID. Хотелось чтобы автоматически создавался ID с помощью метода createID() от 1000 до 10000. В чем заключается моя ошибка?

public class IDGenerator {
    private int ID;

    public IDGenerator() {
        ID = createID();
    }

    public int getID() {
        return ID;
    }

    public int createID() {
        return (int) ((Math.random() + (9999 - 1000)) + 1000);
    }
}
 
public class Main {
    public static void main(String[] args) {
        IDGenerator[] IDs = new IDGenerator[10];
        int i = 0;
        while (i < 10) {
            IDs[i] = new IDGenerator();
            i++;
        }
        for (IDGenerator id : IDs) {
            System.out.println(id.getID());
        }
    }
 }

Ответы

▲ 3Принят

Проблема в представленном коде в том, что Math.random() возвращает значения в диапазоне [0.0; 1.0), к которым прибавляется 9999, и результат приводится к целому числу, полностью обрезая вычисленное случайное значение.

Скорее всего, в коде была допущена опечатка, и следовало заменить + на *:

public int createID() {
    return (int) ((Math.random() * 9000) + 1000);
}

чтобы получить числа от 1000 до 9999

Однако, лучше воспользоваться готовыми методами:

  • Random::nextInt(int bound) вернёт случайные целые числа от 0 до верхней границы [0, bound):
private Random random = new Random();

public int createID() {
    return random.nextInt(9000) + 1000;
}
public int createID() {
    return ThreadLocalRandom.current().nextInt(1000, 10_000);
}