Странные же цифры - PullRequest
       15

Странные же цифры

0 голосов
/ 21 сентября 2011

Я использую некоторые случайные числа в качестве начальных значений для моих расчетов по метаэвристической оптимизации.Я запускаю одну и ту же программу оптимизации на разных компьютерах с использованием MPI.Я неожиданно получил много таких же результатов.Например, я использую 40 хост-компьютеров, результаты имеют несколько разных значений.Почти 6-7 значений одинаковы.На самом деле мои результаты могут быть похожими, но они не должны быть одинаковыми, потому что я даю им случайные числа в качестве инициалов в начале программы (в моем примере выше я должен получить 40 разных значений).Если я запускаю программу несколько раз и последовательно на одном и том же компьютере, она дает разные результаты, как и должно быть.

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

PS Я использую srand( (unsigned) time(NULL) ) один раз в начале моей программы для генерации случайных чисел.Затем я генерирую свои случайные числа в диапазоне [0, 1], используя (float)rand()/32767

Один из примеров моих результатов, на которые я жаловался:

15.42161751
19.83328438
3.43446541
23.50453377
23.50453377
3.43446541
19.83328438
23.50453377
3.43446541
7.52127457
7.52127457
23.50453377
7.52127457
7.52127457
23.50453377
19.83328438
19.83328438
19.83328438
7.52127457
15.42161751
3.43446541
19.83328438
19.83328438
15.42161751
23.50453377
23.50453377
5.29145241
19.83328438
19.83328438
19.83328438
19.83328438
7.52127457
23.50453377
3.43446541
19.83328438
23.50453377
7.52127457
3.43446541
7.52127457
5.29145241

Ответы [ 5 ]

6 голосов
/ 21 сентября 2011

Генераторы случайных чисел могут получать одно и то же начальное значение.

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

4 голосов
/ 21 сентября 2011

Вы правы, генератор случайных чисел по умолчанию в C ++ часто не очень высокого качества.Если ваш компилятор реализовал какой-либо из C ++ 11, у вас может быть больше вариантов выбора, см. Этот краткий справочник: http://en.wikipedia.org/wiki/C%2B%2B11#Extensible_random_number_facility.Если у вас нет этих классов, вы можете найти их в boost.random .

Вы можете также рассмотреть источник истинных случайных чисел, а не имитируемые псевдослучайные числа, доступныеиз библиотеки, например, файл устройства / dev / random в Linux.

2 голосов
/ 21 сентября 2011

Это потому, что на некоторых ваших хост-компьютерах одинаковое время, поэтому srand() занимает одинаковое время, и поэтому случайная последовательность имеет одинаковую начальную точку, поэтому, конечно, вы получаете одинаковые случайные числа.Попробуйте это:

srand(time(0)*my_computer_id);
2 голосов
/ 21 сентября 2011

Качество генератора случайных чисел не является проблемой. Даже генератор случайных чисел C не будет выдавать повторяющиеся значения, как вы видите, если вы не используете тот же начальный размер. Функция time имеет разрешение в секундах, поэтому неудивительно, что если вы породите несколько процессов, генераторы случайных чисел получат одинаковое начальное число. Вы, вероятно, хотели функцию, такую ​​как clock , которая имеет более высокое разрешение.

Использование часов в качестве начального числа имеет по крайней мере еще одну проблему: становится невозможным получить одни и те же результаты дважды из вашего кода.

1 голос
/ 22 сентября 2011

Используйте что-то более точное, чем time(NULL).Я использую static_cast<int64>(clock()) + time(NULL).Вы также можете использовать другие источники энтропии, такие как буфер клавиатуры, экранный буфер, области памяти и т. Д. Зависит от качества случайности, необходимой вашему приложению.

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