Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 80, средняя оценка - 4.70
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
#1

Генератор нормально распределенной случайной величины в заданном диапазоне - C++

14.05.2013, 23:05. Просмотров 11916. Ответов 19
Метки нет (Все метки)

Здравствуйте, некоторое время назад я создавал тему с вопросом о том как сгенерировать случайные числа в диапазоне от Ν до M, Z число раз. Тогда мне посоветовали следующий код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
double dblRand(double min, double max) {
 
    double x=(double)rand()/RAND_MAX;
    return min+x*(max-min);
 
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
 
    ListBox1->Clear();
    randomize();
 
    int lim = 100000; // число можно и поскромнее поставить, либо использовать для 
                      // вывода массива нечто другое :)
 
    while (lim--)
        ListBox1->Items->Add(FloatToStr(dblRand(140, 160)));
 
}
Но в последствии я понял, что генерируется не нормально распределенная величина (также называемое распределением Гаусса), а равномерно распределенная величина (а может я ошибаюсь???). Подскажите генератор случайной величины которая распределена нормально (по Гауссу), и так чтобы генерировались случайные числа в диапазоне от Ν до M, Z число раз.

Добавлено через 23 часа 55 минут
Подскажите пожалуйста, срочно нужно.. совсем застопорился.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 23:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генератор нормально распределенной случайной величины в заданном диапазоне (C++):

Смоделировать алгоритм непрерывной случайной величины распределенной с плотностью - C++
Прошу помощи, так как не могу выполнить данное задание. Делал на матлабе, но преподавателю это не понравилось. C++ толком не понимаю....

Плотность вероятности случайной величины - C++
задали задачку ,не могу понять что нужно сделать , помогите что тут нужно делать? Перепечатывайте пожалуйста задание непосредственно на...

Определить математическое ожидание дискретной случайной величины - C++
помогите решить задачи на C или C++: 1Дан двумерный массив элементов иллюстрирующий закон распределения дискретной случайно велечины ....

Моделирование случайной величины с заданным законом распределения - C++
нужна программка на с++ сгенерировать x по заданным законам распределения помогите пожалуйста!

Получить распределение случайной величины по закону Пуассона - C++
Подскажите, пожалуйста, есть ли в C++ функция, с помощью которой можно получить распределение заданной случайной величины по закону...

Моделирование генеральной совокупности случайной величины по заданному закону распределения - C++
1. Составить программу, которая позволяет производить генерацию генеральной совокупности случайной величины в соответствии с заданным...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
15.05.2013, 15:11 #2
NikWhite,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
double gen(double mn, double mx) { // не используйте min max это функции из cmath
    int dx = mx - mn;
    double accur = 1e3;
    int fmx = dx * accur;
    double t = rand()%fmx;
    t /= accur;
    return mn + t;
}
 
int main() {
    for (int i = 0; i < 1000; i++) {
        printf("%.5lf\n", gen(39, 42));
    }
    return 0;
}
Добавлено через 1 минуту
NikWhite, ваще тут при больших значениях фигня будет

Добавлено через 1 минуту
NikWhite, если числа маленькие, то юзайте

Добавлено через 41 секунду
NikWhite, randMAX просто слишком маленький
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
15.05.2013, 15:18 #3
NikWhite, для генерации нормально распределенных случайных величин используется преобразование Бокса-Мюллера. Гуглится легко, на все про все - три простенькие формулы.
1
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
15.05.2013, 18:19 #4
Цитата Сообщение от NikWhite Посмотреть сообщение
нормально распределенной случайной величины в заданном диапазоне
А что это за такое "нормальное распределение" на конечном отрезке?
0
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
15.05.2013, 19:47  [ТС] #5
Цитата Сообщение от kamre Посмотреть сообщение
А что это за такое "нормальное распределение" на конечном отрезке?
Имеется, промежуток, например от 200 до 300, в этом промежутке нужно сгенерировать нормально распределенную случайную величину.
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
15.05.2013, 20:41 #6
Цитата Сообщение от NikWhite Посмотреть сообщение
в этом промежутке нужно сгенерировать нормально распределенную случайную величину
Почитайте про определение нормального распределения, там никаких промежутков нет, любое действительное значение может приниматься.
0
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
15.05.2013, 23:41  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
NikWhite, для генерации нормально распределенных случайных величин используется преобразование Бокса-Мюллера. Гуглится легко, на все про все - три простенькие формулы.
Пробовал бокса-мюллера,но он жутко медленный (зависал даже на 10 значениях), совсем не подходит. решил использовать центральную предельную теорему

double NormalDistribution()
C++
1
2
3
4
5
6
7
{
    double S = 0.;    
    for (int i = 0; i < 12; ++i) 
        S += (double)rand() / RAND_MAX;
 
   return S - 6.;
}
Попытался сделать, чтобы это работало в конкретном диапазоне (от 200 до 300), но не получилось, попадаются числа выпадающие из этого диапазона.

Добавлено через 13 минут
Цитата Сообщение от kamre Посмотреть сообщение
Почитайте про определение нормального распределения, там никаких промежутков нет, любое действительное значение может приниматься.
Я могу генерировать случайною величину в заданном диапазоне, она получится равномерно распределенной на этом промежутке, а потом с помощью центральной предельной теоремы перейду к нормально распределенной.

И еще Χ принадлежит [-∞;+∞], теоретически есть промежутки.

Добавлено через 2 часа 30 минут
Цитата Сообщение от Ternsip Посмотреть сообщение
NikWhite,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
double gen(double mn, double mx) { // не используйте min max это функции из cmath
    int dx = mx - mn;
    double accur = 1e3;
    int fmx = dx * accur;
    double t = rand()%fmx;
    t /= accur;
    return mn + t;
}
 
int main() {
    for (int i = 0; i < 1000; i++) {
        printf("%.5lf\n", gen(39, 42));
    }
    return 0;
}
Добавлено через 1 минуту
NikWhite, ваще тут при больших значениях фигня будет

Добавлено через 1 минуту
NikWhite, если числа маленькие, то юзайте

Добавлено через 41 секунду
NikWhite, randMAX просто слишком маленький
Тут не нормально распределенная получается и мне нужно генерировать от 1000 значений.
0
Psilon
Master of Orion
Эксперт .NET
5892 / 4789 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
15.05.2013, 23:44 #8
Копипастю из старой своей методы:
Генерация нормально распределенных чисел. Неинтегрируемость функции нормального распределения не позволяет использовать приведенный метод. Поэтому для генерации нормально распределенных чисел применяется способ, основанный на центральной предельной теореме (ЦПТ). Согласно ЦПТ, распределение суммы независимых одинаково распределенных случайных величин с увеличением числа слагаемых стремится к нормальному распределению. Если слагаемые равномерно распределены в интервале [0,1], то
Генератор нормально распределенной случайной величины в заданном диапазоне
Сумма равномерных случайных величин сходится к нормальному распределению достаточно быстро, и практика показала, что уже при n > 10 сходимость хорошая.
Однако непосредственно пользоваться приведенными соотношениями нельзя из-за зависимости параметров распределения Y от числа слагаемых и жесткой связи между my и σ2y. Поэтому для нормальных случайных величин с заданными параметрами my и σy используется следующая двухэтапная процедура, основанная на устойчивости нормального распределения к линейному преобразованию.
В начале формируется последовательность чисел {z}, подчиненных нормированному нормальному распределению (т.е.нормальному распределению с параметрами mz = 0; σz=1). Для этого выполняется операция
Название: 2.JPG
Просмотров: 3115

Размер: 9.7 Кб
Как нетрудно видеть, mz = 0; σz=1.
Затем последовательность {z} преобразуется в требуемую последовательность
{y} по формуле
Название: 3.JPG
Просмотров: 3113

Размер: 9.4 Кб
Следует обратить внимание, что для получения одного числа последовательности {y} надо использовать 12 равномерных чисел.
Программа, реализующая описанную процедуру, в отличие от датчика равномерных чисел, может не содержаться в математическом обеспечении компьютера.
0
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
16.05.2013, 19:31  [ТС] #9
Цитата Сообщение от Psilon Посмотреть сообщение
Копипастю из старой своей методы:
Ну код, наверное, так и выглядит
C++
1
2
3
4
5
6
7
{
    double S = 0.;    
    for (int i = 0; i < 12; ++i) 
        S += (double)rand() / RAND_MAX;
 
   return S - 6.;
}
0
Psilon
Master of Orion
Эксперт .NET
5892 / 4789 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
16.05.2013, 19:54 #10
Ну а чего вам еще не хватает??
0
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
16.05.2013, 22:49  [ТС] #11
Цитата Сообщение от Psilon Посмотреть сообщение
Ну а чего вам еще не хватает??
Дело то как раз и в промежутке, когда я генерирую равномерно распределенную случайную величину в промежутке от 200 и до 300, то все ок, но потом же эти значения используются в коде который я прислал, они складываются и в итоге распределение нормальное,а значения в этом промежутке не находятся (там получаются значения от 2х тысяч). Надо как то переписать код, чтобы значения были и нормально распределенные и находились в промежутке от 200 до 300.
0
Psilon
Master of Orion
Эксперт .NET
5892 / 4789 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
16.05.2013, 23:07 #12
Еще раз:
http://www.cyberforum.ru/cgi-bin/latex.cgi?y =  {\sigma}_{y}z + {m}_{y}
1
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
19.05.2013, 18:46  [ТС] #13
Цитата Сообщение от Psilon Посмотреть сообщение
Еще раз:
http://www.cyberforum.ru/cgi-bin/latex.cgi?y =  {\sigma}_{y}z + {m}_{y}
Так не работает.Видимо не совсем поняли. Мне нужно сделать так чтобы нормально распределенная случайная величина находилась в промежутке от 200 до 300, но так сделать нельзя, поэто нужно нгенерировать равномерную от 200 до 300, перевести ее в нормальную, и сделать проекцию, как буд то, нормально распределенная находится от 200 и до 300.
0
Psilon
Master of Orion
Эксперт .NET
5892 / 4789 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
19.05.2013, 19:04 #14
NikWhite, омг, в вашем случае mx = 250, http://www.cyberforum.ru/cgi-bin/latex.cgi?\sigmax = 100/6 ~ 16.67
1
NikWhite
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 40
19.05.2013, 23:42  [ТС] #15
Цитата Сообщение от Psilon Посмотреть сообщение
NikWhite, омг, в вашем случае mx = 250, http://www.cyberforum.ru/cgi-bin/latex.cgi?\sigmax = 100/6 ~ 16.67
250 получилась в результате (300+250)/2, а сигма -(300-200)/6 ? что за формула?что такое 6. Можете сказать в более общем виде, а то у меня границы любыми могут быть, не только 200 и 300.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 23:42
Привет! Вот еще темы с ответами:

Вычислить математическое ожидание, дисперсию и среднеквадратичное отклонение случайной величины - C++
Пусть массив X(N) - массив возможных значений некоторых случайных величин. Составить подпрограмму, которая вычисляет математическое...

Найти первый начальный и второй центральный момент случайной величины (работа с одномерным массивом) - C++
Найти , где (k=10) - заданный вектор и следует организовать ввод его элементов с клавиатуры.

простое число в заданном диапазоне - C++
необходимо найти наименьшее простое число в заданном диапазоне

Случайные числа в заданном диапазоне - C++
Подскажите как написать программу, которая генерирует последовательность из N случайных чисел в диапазоне от 1 до 10, выводит эти числа на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.05.2013, 23:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru