При использовании генератора случайных чисел это лучший способ использовать его для большей случайности нового значения:
У вас есть метод, который каждый раз создает новый экземпляр RNG, а затем возвращает значение?
Есть ли экземпляр ГСЧ на уровне класса, который создается один раз в конструкторе, и все последующие вызовы нового случайного значения с использованием существующего экземпляра?
Проблема в том, что может быть много вызовов для случайного числа, часто в разных областях, не связанных друг с другом.
Это не проблема производительности, поэтому тот факт, что каждый вызов может создавать новый экземпляр, не имеет значения. Все дело в случайности возвращаемого значения.





Вариант 1 вообще-то не работает.
Вариант 2 - единственный выбор. ГСЧ абсолютно требуют, чтобы вы генерировали значения последовательно из одного начального числа.
Ваше «создать новый генератор с новым семенем» ломает математическую основу. То, что вы получите, полностью зависит от ваших семян, которые, к сожалению, не будут случайными.
См. stackoverflow.com/questions/203382/… и stackoverflow.com/questions/295628/….
Я предлагаю вариант 3: использовать один ГСЧ во всей программе. Он требует блокировки или локального потока, если RNG не является потокобезопасным (например, в .NET), но это значительно упрощает жизнь, и вам не нужно беспокоиться о повторении.
Подробнее о классе .NET StaticRandom, который я написал для этой цели, см. В соответствующая страница MiscUtil. (Это невероятно просто - вообще ничего умного.)
Согласовано. Вы хочу для заполнения RNG только один раз (что означает использование одного глобального экземпляра).
Обновлено: Я считаю, что имею в виду вариант 3, как упоминалось в другом ответе, то есть глобальный случайный менеджер, хотя в определенном классе вы можете делать то же самое.
Еще одно преимущество использования варианта 2 состоит в том, что если вам когда-либо понадобится функция «воспроизведения» в вашем программном обеспечении, вы можете просто сохранить начальное число, которое вы использовали для инициализации ГСЧ. В следующий раз вам нужно только заставить RNG использовать сохраненное начальное число, и вы получите точно такой же набор поведения, предполагая, что нет других проблем, таких как параллелизм / потоки, которые могут изменить порядок выполнения.
Возможно, вы захотите сделать что-то подобное, если ваше программное обеспечение запускает эксперимент, который требует большого количества случайностей, но где вы можете захотеть повторить конкретный запуск, чтобы продемонстрировать другим людям. Он также часто используется в компьютерных играх, где ИИ будет принимать решения на основе взвешивания возможных вариантов, но в конечном итоге случайное число «выбирает», какое действие они предпринимают.
Это также делает возможной отладку временных ошибок, которые появляются только время от времени. Если вы не сохраняете начальное значение каждого прогона, невозможно воссоздать точные условия, которые вызвали ошибку.
В моделировании этот метод называется «обычными случайными числами», и он позволит провести сравнение двух систем с одинаковой достоверностью и с меньшим количеством выборок, если это будет сделано надлежащим образом.
Я фактически создал класс в java, который запрашивает random.org для случайного числа или набора случайных чисел. Если кому интересно, дайте знать.