Я упростил ошибку, с которой сталкиваются следующие строки кода:
int[] vals = new int[8];
for (int i = 0; i < 1500; i++)
vals[new Random(i).nextInt(8)]++;
System.out.println(Arrays.toString(vals));
Выход: [0, 0, 0, 0, 0, 1310, 190, 0]
Является ли это просто артефактом выбора последовательных чисел для семени Random и затем с помощью nextInt с мощностью 2? Если да, есть ли другие подобные ошибки, о которых я должен знать, а если нет, что я делаю неправильно? (Я не ищу решение вышеупомянутой проблемы, просто некоторое понимание того, что еще может пойти не так)
Дэн, хорошо написанный анализ. Поскольку javadoc довольно подробно описывает, как вычисляются числа, это не тайна относительно того, почему это произошло так же, как если бы были другие аномалии, подобные этому, чтобы следить за этим. Я не видел никакой документации о последовательных семенах, и я Я надеюсь, что кто-то с некоторым опытом работы с java.util.Random может указать на другие распространенные ошибки.
Что касается кода, то для нескольких параллельных агентов необходимо иметь повторяющееся случайное поведение, которое, как правило, выбирает из элементов перечисления 8 в качестве своего первого шага. Как только я обнаружил это поведение, семена все исходят от мастера случайного объекта, созданного из известного семени. В первой (последовательной) версии программы все поведение быстро расходилось после первого вызова nextInt, поэтому мне потребовалось довольно много времени, чтобы сузить поведение программы до библиотеки RNG, и я бы хотел избежать эта ситуация в будущем.