Сравнение различных реализаций со случайными начальными значениями

#c #boost #random-seed

#c #повышение #random-seed

Вопрос:

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

Я установил для обоих значение random seed 0 и запустил их, но результаты, которые я получаю, не совпадают.

У меня есть один вопрос, если обе реализации вызывают функцию, используя случайное начальное значение, например

 boost::variate_generator<boost::mt19937amp;, boost::exponential_distribution<>> random_n(seed, boost::exponential_distribution<>()) ;
  

и если вызвать это больше раз, чем в другой реализации, вызовет ли это десинхронизацию в отношении случайных начальных значений?

Чтобы быть более конкретным, реализация vector имитирует пуассоновский процесс на непрерывном реальном сегменте, например [0,1], тогда как реализация list имитирует PP на отдельных разделах: {[0,0.1], [0.1,0.2], [0.2,0.3], …, [0.9, 1]} а затем объединяет результаты. Имитация PP на большом разделе может означать всего 1 вызов boost::exponential_distribution, но для симуляции на 10 разделах требуется не менее 10 вызовов boost ::exponential_distribution, даже если ни один из них не может быть использован (например, если они превышают раздел).

Даже если вероятностно, эти методы должны генерировать одинаковые результаты, будут ли начальные значения между программами рассинхронизированы? И если да, есть ли какой-либо способ повторно синхронизировать их без изменения реализации?

Комментарии:

1. Я не уверен, что вы имеете в виду под несинхронизированным? Однако начальное значение означает только то, что у вас есть одинаковые псевдослучайные числа в нескольких запусках. Если оба метода выполняют несколько разных операций над этими псевдослучайными числами, то (очевидно) вы получаете разные результаты.

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

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

4. Вы должны обрабатывать номер RNG как один и тот же входной сигнал в обеих реализациях … т.е.. вы не можете выбросить его только потому, что он находится за пределами текущего раздела, тогда вам, вероятно, следует переключить раздел или каким-то образом буферизировать, а затем number, чтобы получить результат позже. Или вы можете сгенерировать фиксированные входные данные, которые предварительно отсортированы по разделам, чтобы они могли использоваться обеими реализациями. Но если использование в реальном мире допускает нерассортированные данные, которые должны быть отфильтрованы, то это своего рода обман, упрощающий вариант со списком.

5. Хорошо, спасибо, это проясняет мой первоначальный вопрос о том, является ли выброс RNGS причиной проблемы. Я думаю, что буферизация результата действительно может быть правильным решением здесь. Теперь я гораздо лучше осознаю ценность RNGS: P