Всегда одни и те же случайные числа в HashSet
У меня есть следующий класс:
public class MyClass
{
private Random rand;
private HashSet<Pair<Integer, Integer>> set;
public MyClass()
{
rand = new Random(Double.doubleToLongBits(Math.random()));
set = new HashSet<Pair<Integer, Integer>>();
}
public void doSomething(int len)
{
set.clear();
for (int i = 0; i < 1000; i++)
{
int index = rand.nextInt(len - 1) + 1;
int min = 1 - index;
int max = len - index - 1;
int j = rand.nextInt(max - min + 1) + min;
if (j != 0)
{
set.add(new Pair<Integer, Integer>(index, j));
}
}
}
}
Pair
пользовательский класс, в котором я могу хранить два целых числа Проблема в том, что каждый раз, когда я звоню doSomething()
HashSet
содержит всегда одни и те же значения.
Как это возможно? Как я могу исправить эту проблему?
РЕДАКТИРОВАТЬ:
это моя пара: /questions/39315775/chto-ekvivalentno-pare-cl-r-v-java/39315803#39315803
3 ответа
Из документации:
Экземпляр этого класса используется для генерации потока псевдослучайных чисел. В классе используется 48-разрядное начальное число, которое модифицируется с использованием линейной конгруэнтной формулы. (См. Дональд Кнут, "Искусство компьютерного программирования", том 3, раздел 3.2.1.)
Если два экземпляра Random создаются с одним и тем же начальным числом, и для каждого выполняется одинаковая последовательность вызовов методов, они будут генерировать и возвращать идентичные последовательности чисел.
Math.random возвращает значение double, а Random получает long в качестве начального числа. Так что, вероятно, вы получаете 0 в качестве семени каждый раз. Попробуйте перейти на System.getNanoTime() только для проверки и посмотрите, что произойдет.
Что касается вашего кода, при запуске его с 5 в качестве параметра len, это приводит к следующему: [(4, -2), (4, -1), (4, -3), (2, -1), (3, -1), (3, -2), (1, 1), (2, 1), (1, 2), (3, 1), (2, 2), (1, 3)] [(4, -2), (3, -1), (4, -1), (4, -3), (3, -2), (2, -1), (1, 1), (2, 1), (1, 2), (3, 1), (2, 2), (1, 3)]
если вы отслеживаете свой код, это не та же пара, каждый раз, когда метод doSomething генерирует новые случайные числа, но в цикле все числа, ведущие j!=0, будут игнорироваться, поэтому у вас будут эти пары,
ваша проблема в этом коде
int index = rand.nextInt(len - 1) + 1;
int min = 1 - index;
int max = len - index - 1;
int j = rand.nextInt(max - min + 1) + min;
if (j != 0)
{
set.add(new Pair<Integer, Integer>(index, j));
}
я имею в виду, что этот код приводит к тому же числу независимо от того, какое случайное число будет.