Соответствуют ли реализации нормального распределения C ++ и randn MATLAB?

Я использую твистер Мерсенна, чтобы иметь согласованные случайные значения между проектами в Matlab и C ++. Но я не смог получить согласованные нормально распределенные псевдослучайные значения при использовании randn или C ++ 11 normal_distribution,

Вот C ++:

void main()
{
unsigned int mersenneSeed = 1977;
std::mt19937_64 generator; // it doesn't matter if I use the 64 or the std::mt19937
generator.seed(mersenneSeed);
std::normal_distribution<double> normal; // default is 0 mean and 1.0 std
double temp = normal(generator);
// results 1.4404780513814264 for mt19937_64 and 1.8252033038258377 for mt19937
}

Вот Matlab:

rng(1977) % default Matlab uses mersenne twister
randn()   % default is 0 mean and 1.0 std

Я использую Matlab 2013b и Visual Studio Express 2013. Что-то не так с нормальным дистрибутивом C ++ 11?

0

Решение

Мерсенн твистер сам по себе выдает только 32-битные целые случайные числа. Наиболее вероятное объяснение несоответствия, которое вы наблюдаете, заключается в том, как эти равномерно распределенные целые числа преобразуются в нормально распределенные числа с плавающей запятой двойной точности.

Поскольку документация randn не объясняет это преобразование, и исходный код недоступен (это встроенная функция), трудно сказать что-либо еще об этом без обратного инжиниринга. (Согласно комментарию Кейси, то же самое относится и к стороне C ++.)

Вероятно, самым простым способом достижения согласованности было бы генерирование случайных чисел в C ++. или же Matlab, сохраните результаты и загрузите их по мере необходимости. Альтернативой было бы написать свою собственную функцию случайных чисел Matlab на C ++ как MEX файл (используя C ++ normal_distribution), и используйте эту функцию в Matlab вместо randn,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]