[VC++] нормальный rand
Доброго времени суток, многоуважаемый ALL.
Люди, может кто подскажет как написать функцию, котороя выдавала бы
случайные числа, распределенные по нормальному закону?
--
С бестами и регардами
Havoc
mailto:hav***@i*****.ru
Номер выпуска : 2831
Возраст листа : 204 (дней)
Количество подписчиков : 388
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/124926
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru
Hello Havoc,
Tuesday, April 13, 2004, 5:55:19 PM, you wrote:
для начала посоветую не использовать стандартную функцию rand, а
зайти сюда и взять исходник mtrand'a
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
а стандартный нормальный закон из равномерного распределения получается так:
пусть:
x - элемент генерящейся выборки,
r - элементы равномерного распределения, которые получаем функцией mtrand()
mtrand - возвращает случайное значение в промежутке [0,1]
1 способ:
более точный
(для получения одного x нужно выбрать два r из равномерного)
r1 = mtrand();
r2 = mtrand();
x = sqr( -2 * ln(r2) ) * cos(PI*r1)
либо
x = sqr( -2 * ln(r2) ) * sin(PI*r1)
2 способ:
на один x требуется 12 r
double r[12];
for(i=0; i<12; i++){
r[i] = mtrand();
}
x = sum(r) - 6;
может в синтаксисе ошибся, но это не имеет значения. общая идея должна
быть понятна.