Генератор случайных чисел: уровень класса или уровень метода?

При использовании генератора случайных чисел это лучший способ использовать его для большей случайности нового значения:

  1. У вас есть метод, который каждый раз создает новый экземпляр RNG, а затем возвращает значение?

  2. Есть ли экземпляр ГСЧ на уровне класса, который создается один раз в конструкторе, и все последующие вызовы нового случайного значения с использованием существующего экземпляра?

Проблема в том, что может быть много вызовов для случайного числа, часто в разных областях, не связанных друг с другом.

Это не проблема производительности, поэтому тот факт, что каждый вызов может создавать новый экземпляр, не имеет значения. Все дело в случайности возвращаемого значения.

Я фактически создал класс в java, который запрашивает random.org для случайного числа или набора случайных чисел. Если кому интересно, дайте знать.

Relequestual 23.07.2009 01:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
464
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вариант 1 вообще-то не работает.

Вариант 2 - единственный выбор. ГСЧ абсолютно требуют, чтобы вы генерировали значения последовательно из одного начального числа.

Ваше «создать новый генератор с новым семенем» ломает математическую основу. То, что вы получите, полностью зависит от ваших семян, которые, к сожалению, не будут случайными.

Я предлагаю вариант 3: использовать один ГСЧ во всей программе. Он требует блокировки или локального потока, если RNG не является потокобезопасным (например, в .NET), но это значительно упрощает жизнь, и вам не нужно беспокоиться о повторении.

Подробнее о классе .NET StaticRandom, который я написал для этой цели, см. В соответствующая страница MiscUtil. (Это невероятно просто - вообще ничего умного.)

Согласовано. Вы хочу для заполнения RNG только один раз (что означает использование одного глобального экземпляра).

orip 25.11.2008 14:43
Ответ принят как подходящий

Обновлено: Я считаю, что имею в виду вариант 3, как упоминалось в другом ответе, то есть глобальный случайный менеджер, хотя в определенном классе вы можете делать то же самое.

Еще одно преимущество использования варианта 2 состоит в том, что если вам когда-либо понадобится функция «воспроизведения» в вашем программном обеспечении, вы можете просто сохранить начальное число, которое вы использовали для инициализации ГСЧ. В следующий раз вам нужно только заставить RNG использовать сохраненное начальное число, и вы получите точно такой же набор поведения, предполагая, что нет других проблем, таких как параллелизм / потоки, которые могут изменить порядок выполнения.

Возможно, вы захотите сделать что-то подобное, если ваше программное обеспечение запускает эксперимент, который требует большого количества случайностей, но где вы можете захотеть повторить конкретный запуск, чтобы продемонстрировать другим людям. Он также часто используется в компьютерных играх, где ИИ будет принимать решения на основе взвешивания возможных вариантов, но в конечном итоге случайное число «выбирает», какое действие они предпринимают.

Это также делает возможной отладку временных ошибок, которые появляются только время от времени. Если вы не сохраняете начальное значение каждого прогона, невозможно воссоздать точные условия, которые вызвали ошибку.

В моделировании этот метод называется «обычными случайными числами», и он позволит провести сравнение двух систем с одинаковой достоверностью и с меньшим количеством выборок, если это будет сделано надлежащим образом.

John with waffle 25.11.2008 19:45

Другие вопросы по теме