C ++. Возможно ли, чтобы ГСЧ давал разные случайные величины на двух разных машинах, используя одно и то же начальное число? - PullRequest
5 голосов
/ 21 января 2009

У меня есть этот длинный и сложный исходный код, который использует RNG с fix seed.

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

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

Версия компилятора, библиотеки и ОС совпадают.

Ответы [ 7 ]

9 голосов
/ 21 января 2009

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

5 голосов
/ 22 января 2009

Если вам нужно что-то, что можно повторить с машины на машину, попробуйте Boost Random Number Library .

5 голосов
/ 21 января 2009

Поскольку они дают разные результаты, вполне возможно, что они дают разные результаты. Простой ответ, следующий!

Серьезно: не зная исходного кода ГСЧ, трудно понять, наблюдаете ли вы ошибку или функцию. Но похоже, что рассматриваемая ГСЧ использует второе семя откуда-то еще, например текущее время или какое-либо аппаратно-зависимое значение, например MAC-адрес сетевой карты.

4 голосов
/ 21 января 2009

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

2 голосов
/ 22 января 2009

Да. Например, существуют RNG с плавающей точкой, результаты которых могут зависеть от того, правильно ли ваш процессор реализует плавающие объекты IEEE (не гарантировано в ISO C ++). Кроме того, такие эффекты, как выброс 80-битных битов в память, могут влиять на результаты.

Существует также некоторая возможная путаница в понятии "семя". Некоторые люди определяют семена как все входные данные для установки начального состояния ГСЧ. Другие ограничивают его только явным вводом в коде и исключают неявный ввод, например, из HW источники или /dev/random.

0 голосов
/ 21 января 2009

Это сильно зависит от того, какую ГСЧ вы используете. Такие вещи, как random(3) или семейство rand48(3), предназначены для возврата той же последовательности при запуске с тем же начальным числом. Теперь, если ГСЧ, которую вы используете, берет /dev/random, все ставки выключены, и результаты будут другими.

0 голосов
/ 21 января 2009

Возможно, это маленькая / большая проблема с прямым порядком байтов, или код каким-то образом обнаруживает процессор. Самый простой способ сделать это - использовать точки останова или аналогичные процедуры отладки для наблюдения за процедурами заполнения и самим ГСЧ.

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