Я использую твистер Мерсенна, чтобы иметь согласованные случайные значения между проектами в 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?
Мерсенн твистер сам по себе выдает только 32-битные целые случайные числа. Наиболее вероятное объяснение несоответствия, которое вы наблюдаете, заключается в том, как эти равномерно распределенные целые числа преобразуются в нормально распределенные числа с плавающей запятой двойной точности.
Поскольку документация randn
не объясняет это преобразование, и исходный код недоступен (это встроенная функция), трудно сказать что-либо еще об этом без обратного инжиниринга. (Согласно комментарию Кейси, то же самое относится и к стороне C ++.)
Вероятно, самым простым способом достижения согласованности было бы генерирование случайных чисел в C ++. или же Matlab, сохраните результаты и загрузите их по мере необходимости. Альтернативой было бы написать свою собственную функцию случайных чисел Matlab на C ++ как MEX файл (используя C ++ normal_distribution
), и используйте эту функцию в Matlab вместо randn
,
Других решений пока нет …