2008-11-25 7 views
2

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

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

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

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

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

+0

Я действительно создал класс в java, который запрашивает random.org для случайного числа или набора случайных чисел. Если кто-то заинтересован, дайте мне знать. – Relequestual 2009-07-22 21:24:02

ответ

3

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

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

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

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

+0

В симуляциях этот метод называется «обычными случайными числами» и позволит сравнивать между двумя системами, которые должны выполняться с равной степенью достоверности, с меньшим количеством выборок, когда они выполняются соответствующим образом. – 2008-11-25 16:45:10

8

Вариант 1 не работает, фактически.

Вариант 2 является единственным выбором. RNG абсолютно требует, чтобы вы генерировали значения в последовательности из одного семени.

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

+0

См. Http://stackoverflow.com/questions/203382/do-stateless-random-number-generators-exist#203646 и http: // stackoverflow.com/questions/295628/securerandom-init-once-or-every-time-it-is-needed – 2008-11-25 11:42:05

4

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

Для получения подробной информации о классе .NET StaticRandom см. the relevant MiscUtil page. Я написал для этой цели. (Это невероятно просто - ничего умного.)

+0

Согласен. Вы _want_, чтобы засеять RNG только один раз (что означает использование одного глобального экземпляра). – orip 2008-11-25 11:43:52