Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

[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

Ответить   Havoc Tue, 13 Apr 2004 17:55:19 +0400 (#124926)

 

Ответы:

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;

может в синтаксисе ошибся, но это не имеет значения. общая идея должна
быть понятна.

Ответить   Ivan Mikheikin Wed, 14 Apr 2004 02:22:42 +0400 (#124998)

 

Тема: [VC++] нормальный rand

Добавлю, что на http://alglib.manual.ru/random/norm.php есть описание алгоритмов

Ответить   Wed, 14 Apr 2004 09:58:29 +0400 (#125095)

 

-=[Бодрого времени сУток!]=-
13 апреля 2004 г. /вторник 16:55:19/ Havoc |E-Mail: <mailto:hav***@i*****.ru>|
в мессаге <<[VC++] нормальный rand>> накрапал:
[B~E~G~I~N~>

~~~< Message on address 0x00000000 cannot be read (written) >[E|.|N|.|D|.>

Это exp(x^2)?
Самый простой - просто запряги экспоненту в рандом и все...
Более сложные можно обсудить на личке...

Ответить   -=BorMaN=- Tue, 13 Apr 2004 23:09:09 +0300 (#125583)

 

Тема: Re: [VC++] нормальный rand

НЕ-А! Это в корне НЕВЕРНО! Хотя и на первый взгляд покажется странным такое утверждение
...

Ответить   Wed, 14 Apr 2004 19:16:14 +0400 (#125601)

 

Hello Havoc,


Используем центральную предельную теорему: суммируем много случайных
величин, неважно как распределенных, и получаем величину с нормальным
(гауссовым) распределением.

double r = 0;
for (int i = 0; i < 12; i++) r += rand(); // суммируем
r -= (double) RAND_MAX / 6; // а это чтобы центр в нуле был

Ответить   Fri, 16 Apr 2004 17:21:14 +0400 (#127254)