Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ преобразование Бокса-Мюллера

Клаус Гуру (3263), закрыт 8 лет назад
Делаю генератор нормального распределения по сией чудо-формуле с Википедии (и не отлько там она)
случайные величины "фи" и "r" взяты в диапозоне от 0 до 1 и распределены равномерно (эта часть генератора работает правильно)
Но вот в результате преобразования значения получаются наоборот, вместо одного центра тяжести в мат. ожидании там минимум, а максимум значений у среднеквадратичных отклонений

Вот кусок кода с преобразованием (array1 - это массив равномерно распределенных случайных величин)
array2[ij]=cos(2*PI*array1[ij+1])*pow((-2)*log(array1[ij]),(1/2));
array2[ij+1]=sin(2*PI*array1[ij+1])*pow((-2)*log(array1[ij]),(1/2));
Лучший ответ
Капитан Гугл Искусственный Интеллект (146261) 8 лет назад
1/2==0. Целочисленное деление же.
А вообще приводи минимальный воспроизводимый пример. Т. е. подставляй какие-то значения до вычислений и выводи после, чтобы можно было проверить твои выводы.
КлаусГуру (3263) 8 лет назад
Три дня думал в чем косяк, а проблема оказалась в такой мелочи...
Действительно заменил pow((-2)*log(array1[ij]),(1/2) на pow((-2)*log(array1[ij]),long double(0.5) и все заработало!
Остальные ответы
Чайкин Виталий Мыслитель (7598) 8 лет назад
Что ты хочешь чтобы мы нашли в этой КАШЕ? неудивительно что не работает ...
отдельно вычисли компоненты формулы, и только затем подставь ...
a = -2 ln r
b = sqr(a)
c = 2 Pi Fi
d = cos( c )
z0 = d * b
Батаев Дмитрий Просветленный (23300) 8 лет назад
Индекс приращения в массиве ij=ij+2 или как?
Похожие вопросы