2013-03-01 2 views
0

Если разные классы приложения должны извлекать одно или несколько случайных чисел, где должен быть инициализирован генератор случайных чисел для создания хороших случайных последовательностей?Сколько генераторов случайных чисел я должен использовать?

В частности, мне нужно построить несколько деревьев решений, чтобы обучить случайный лес. Конструкция каждого дерева решений включает в себя следующие этапы:

  1. Загружен набор данных (организованный на несколько рядов данных).
  2. Некоторые строки в этом наборе данных случайным образом выбраны для создания нового набора данных. Этот новый набор данных будет постепенно раздроблен во время роста дерева.
  3. Этот новый набор данных используется для того, чтобы вырастить дерево решений: для создания каждого узла необходим произвольный выбор из нескольких строк этого нового набора данных (перед созданием одного узла вам необходимо случайным образом сгенерировать несколько небольших подмножеств этого нового набора данных).

Три этапа, перечисленные выше, выполняются для построения каждого дерева решений. Только что описанная процедура предусматривает, что генерация случайных чисел происходит несколько раз. Например, второй шаг должен обеспечить, чтобы каждое дерево решений обучалось с набором данных, немного отличающимся от исходного, поэтому генератор случайных чисел должен избегать генерации равных наборов данных (или, в любом случае, вероятность этого возникновения должна быть очень низкой) ,

В сущности, в этой процедуре можно выделить два источника случайности:

  • поколение N случайного набора данных, каждый из которых приручить одного дерева решений;
  • Прежде чем вы создадите узел, вы должны выполнить случайные выделения из заданного набора данных M.

Сколько генераторов случайных чисел следует использовать? Поскольку у меня есть класс, который реализует случайный лес, а другой класс, реализующий дерево решений, я думал, что инициализирую генератор случайных чисел в первом классе (первый источник случайности) и другой генератор случайных чисел в второй класс (второй источник случайности). Это верно?

В целом, каковы рекомендации по выбору правильного числа генераторов псевдослучайных чисел?

+3

'int main() {srand (time (NULL));/** /} ' – andre

+1

два генератора случайных чисел не более случайны, чем один генератор случайных чисел. – argentage

+1

Мне нравится PRNG« Мерсенн Твистер ». Он имеет очень длительный период 2^19937 - 1. Если вам нужно, вы можете сделать его объектом для одновременного выполнения нескольких операций. –

ответ

2

В зависимости от того, насколько повторяемой вам нужна последовательность. например если вы не можете гарантировать порядок, в котором выполняются вызовы rand(), и каждый раз для их создания необходимо сгенерировать одну и ту же последовательность, тогда вам понадобится отдельное семя/генератор для каждой из этих очередей.

Если вы не заботитесь о повторяемости, просто используйте один генератор, одно семя и позвольте ему работать.

5

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

0

Используйте только один генератор случайных чисел для всех функций.

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

2

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

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

На самом деле, если вы используете Unix-подобную систему, рассмотрите возможность использования /dev/random для вашего генератора. Не кодируйте свои собственные, так как практически любая система, которую вы используете, гарантированно предоставляет собственные или библиотеки для создания случайности.

В общем, рассмотрите возможность использования генераторов, которые используют внешние источники (шум от компьютерного оборудования), вместо того, чтобы вычислять свои собственные.

Смежные вопросы