Распределенные вычисления между операционными системами в C ++, проблема rand () - PullRequest
1 голос
/ 10 июня 2011

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

Основная идея состоит в том, что я запускаю вычисления 3 раза, и результаты должны бытьточно так же.Однако, приложение должно будет работать на Mac, Linux и Windows.В основном это означает, что я не могу использовать rand ().

Я, вероятно, ищу генератор замены, который принимает начальное значение (предоставленное сервером) и дает одинаковые результаты на каждой платформе.

Мой вопрос: действительно ли это то, что я ищу, и у вас есть хорошая рекомендация, или я должен делать это по-другому?

Ответы [ 3 ]

7 голосов
/ 10 июня 2011

Взгляните на Boost.Random объектов.Они предоставляют вам широкий выбор алгоритмов, которые гарантированно дают одинаковые результаты всегда.

2 голосов
/ 10 июня 2011

Напишите свой собственный. Это удивительно просто.

«Числовые рецепты на языке Си - искусство научных вычислений» имеет несколько алгоритмов, и я могу представить вам только один («Минимальный» генератор случайных чисел Парк и Миллер.):

#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define MASK 123459876



float ran0(long *idum)
{
 long k;
 float ans;
 *idum ^= MASK;
 k=(*idum)/IQ;
 *idum=IA*(*idum-k*IQ)-IR*k;
 if (*idum < 0) *idum += IM;
  ans=AM*(*idum);
 *idum ^= MASK;
 return ans;
}

Возвращает случайное отклонение от 0,0 до 1,0. Установите или сбросьте idum на любое целочисленное значение (кроме маловероятного значения MASK) для инициализации последовательности; idum не должен изменяться между вызовами последовательных отклонений в последовательности.

EDIT

Так как вам нужны хорошие характеристики для ГСЧ, вы можете использовать быстрый и грязный алгоритм. Вот один из них:

unsigned long idum; // initialize the value to something
// get a RND
idum = 1664525L*idum + 1013904223L;
0 голосов
/ 10 июня 2011

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

...