Почему не работает Math.random() при создании нового объекта?
Не могу понять почему при инициализации нового объекта не выпадает рандомное число атрибуту 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());
}
}
}
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Проблема в представленном коде в том, что 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;
}
ThreadLocalRandom::nextInt(int origin, int bound)вернёт случайные числа от нижней границы до верхней[origin, bound)
public int createID() {
return ThreadLocalRandom.current().nextInt(1000, 10_000);
}