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

Случайные числа с заданным распределением - C++

Восстановить пароль Регистрация
 
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 06:19     Случайные числа с заданным распределением #1
Что то не соображу, как сделать генератор случайных чисел с плавающей запятой, имеющий заданное, например нормальное распределение. Синтаксис
C++
1
x=NormRandom(M, D);
, где M - математическое ожидание, D - дисперсия. Понятно, что числа будут псевдослучайными, а не истинно случайными, но требуется хоты бы имитация нормального распределения с заданными параметрами.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 06:19     Случайные числа с заданным распределением
Посмотрите здесь:

C++ случайные числа
C++ случайные числа
генерация случайных чисел с заданным распределением вероятности C++
Случайные числа в C++ C++
C++ Случайные числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
31.07.2015, 06:29     Случайные числа с заданным распределением #2
>> Нормальное распределение

Возвращает случайное число, распределенное по нормальному закону распределения
с заданным математическим ожиданием и дисперсией

Автор: Mystic, mystic2000@newmail.ru, ICQ:125905046, Харьков
Copyright: Из книги Полякова и Круглова "Turbo Pascal 5.5"
Дата: 25 апреля 2002 г.
*****************************************************
C++
1
2
3
4
5
6
7
8
9
10
11
12
double NormRandom(double Mx, double Sigma)
{
   double  a, b, r, Sq;
   do
   {
    a = 2.0 * rand()/RAND_MAX - 1.0;
    b = 2.0 * rand()/RAND_MAX - 1.0;
    r = a*a+b*b;
   }while( r >= 1);
   Sq = sqrt(-2.0 * Log(r) / r);
   return Mx + Sigma * a * Sq;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
31.07.2015, 06:31     Случайные числа с заданным распределением #3
taras atavin, std::normal_distribution из c++11
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 06:42  [ТС]     Случайные числа с заданным распределением #4
Что это:
std::normal_distribution<double> distribution(5.0,2.0);
?
number = distribution(generator);
А где ж параметры распределения то?

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
double NormRandom(double Mx, double Sigma)
Что такое Sigma и как она связана с дисперсией?

Добавлено через 40 секунд
Что это:
Цитата Сообщение от zss Посмотреть сообщение
RAND_MAX
?
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 06:45     Случайные числа с заданным распределением #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это:
Шаблонная магия создающая генератор случайных чисел.
Цитата Сообщение от taras atavin Посмотреть сообщение
А где ж параметры распределения то?
Строчкой выше, в конструкторе генератора созданного шаблонной магией.
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое Sigma и как она связана с дисперсией?
Очевидно, корень квадратный из дисперсии. "Правило трех сигм" ничего не говорит?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:04  [ТС]     Случайные числа с заданным распределением #6
Цитата Сообщение от Renji Посмотреть сообщение
Шаблонная магия создающая генератор случайных чисел.
Что это шаблон я и сам вижу. Какая величина здесь декларирована?

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Строчкой выше, в конструкторе генератора созданного шаблонной магией.
А если я не хочу для каждого распределения заводить отдельную декларацию? А если параметры распределения вводятся с клавиатуры пользователем?

Добавлено через 21 секунду
Цитата Сообщение от Renji Посмотреть сообщение
"Правило трех сигм" ничего не говорит?
Нет конечно.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 07:08     Случайные числа с заданным распределением #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это шаблон я и сам вижу. Какая величина здесь декларирована?
А в документацию посмотреть? Первый аргумент - мат-ожидание, второй - сигма.
Цитата Сообщение от taras atavin Посмотреть сообщение
А если я не хочу для каждого распределения заводить отдельную декларацию? А если параметры распределения вводятся с клавиатуры пользователем?
И кто вам мешает передать введенные параметры в конструктор?
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет конечно.
Значит, учить матчасть.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:28  [ТС]     Случайные числа с заданным распределением #8
Цитата Сообщение от Renji Посмотреть сообщение
И кто вам мешает передать введенные параметры в конструктор?
А зачем мне на каждое распределение конструировать отдельную переменную?

Добавлено через 5 минут
Кроме того,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
  const int nrolls=10000;  // number of experiments
  const int nstars=100;    // maximum number of stars to distribute
  double M, D;
 
  std::default_random_engine generator;
  std::normal_distribution<double> distribution(5.0,2.0);
  std::cout<<"M=";
  std::cin>>M;
  std::cout<<"D=";
  std::cin>>D;
/*  передавать уже поздно, констуктор давно отработал*/.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 07:31     Случайные числа с заданным распределением #9
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем мне на каждое распределение конструировать отдельную переменную?
Чтобы хранить в ней два параметра распределения. Хранить их отдельно от генератора не по ООП-феншую.
Цитата Сообщение от taras atavin Посмотреть сообщение
передавать уже поздно, констуктор давно отработал
Вам религия запрещает поставить std::normal_distribution<double> distribution(5.0,2.0); после cin?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:34  [ТС]     Случайные числа с заданным распределением #10
Цитата Сообщение от Renji Посмотреть сообщение
Чтобы хранить в ней два параметра распределения.
Зачем? Для этого уже есть две величины.
Цитата Сообщение от Renji Посмотреть сообщение
Хранить их отдельно от генератора не по ООП-феншую.
Вот только здесь то он каким боком? Зато необходима процедурная парадигма.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Вам религия запрещает поставить std::normal_distribution<double> distribution(5.0,2.0); после cin?
После чего его ещё поставить? После ссылки? Или после закрывающей фигурной скобки всей функции? Я раз двести в одной функции буду вводить параметры разнообразных нормальных распределений, для каждой комбинации гонять цикл на миллионы шагов и получать значения одной и той же величины x, каждый раз разные. Нафига мне двести отдельных деклараций задающих распределение величин?
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 07:36     Случайные числа с заданным распределением #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Зачем? Для этого уже есть две величины.
Затем, что эти две величины сдохнут после ближайшего return, а генератор создается на века. Хотя, конечно, ситуации бывают разные.
Цитата Сообщение от taras atavin Посмотреть сообщение
После чего его ещё поставить? После ссылки? Или после закрывающей фигурной скобки всей функции?
Не тупите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
  const int nrolls=10000;  // number of experiments
  const int nstars=100;    // maximum number of stars to distribute
  double M, D;
 
  std::default_random_engine generator;
  std::cout<<"M=";
  std::cin>>M;
  std::cout<<"D=";
  std::cin>>D;
  std::normal_distribution<double> distribution(M,D);
//что-то генерируем в генераторе
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:40  [ТС]     Случайные числа с заданным распределением #12
Цитата Сообщение от Renji Посмотреть сообщение
Не тупите.
Так я и не умею.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
атем, что эти две величины сдохнут после ближайшего return, а генератор создается на века. Хотя, конечно, ситуации бывают разные.
Что за бред? Эти две величины отлично могут быть статик, а то и глобальными, а генератор нужен только в части одной функции и до ретона доживать не обязан.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 07:46     Случайные числа с заданным распределением #13
Цитата Сообщение от taras atavin Посмотреть сообщение
Что за бред? Эти две величины отлично могут быть статик, а то и глобальными, а генератор нужен только в части одной функции и до ретона доживать не обязан.
И будет у вас три десятка "rand(M,D,generator)" вместо трех десятков "rand(generator)". Оно вам надо? Длиннее же выходит.
Цитата Сообщение от taras atavin Посмотреть сообщение
Нафига мне двести отдельных деклараций задающих распределение величин?
C++
1
2
3
4
5
for(int i=0;i<200;++i)
{
    cin>>M>>D;
    std::normal_distribution<double> distribution(M,D);
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 08:03  [ТС]     Случайные числа с заданным распределением #14
Цитата Сообщение от Renji Посмотреть сообщение
C++
1
2
3
4
5
for(int i=0;i<200;++i)
 {
  cin>>M>>D;
  std::normal_distribution<double> distribution(M,D);
}
И?...............
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 08:04     Случайные числа с заданным распределением #15
Цитата Сообщение от taras atavin Посмотреть сообщение
И?...............
И декларация всего одна. Для остального есть оптимизатор.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 08:31  [ТС]     Случайные числа с заданным распределением #16
Цитата Сообщение от Renji Посмотреть сообщение
И декларация всего одна.
Вижу, что одна. Но это же не бейсик, где можно один и тот же массив декларировать двести раз одной и той же строчкой по разу на каждом шагу цикла и он будет динамически менять свою размерность. Сколько здесь величин?
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 08:47     Случайные числа с заданным распределением #17
Цитата Сообщение от taras atavin Посмотреть сообщение
Сколько здесь величин?
Величина в смысле "объект в памяти" одна. На пальцах:
1) В начале итерации в стеке выделяется память под normal_distribution.
2) Вызывается функция "конструктор", которой передается указатель на память normal_distribution.
3) В конце итерации вызывается функция "деструктор", которой передается указатель на память normal_distribution.
4) Выделенная под normal_distribution память освобождается.
5) goto 1.
Потом приходит оптимизатор и путем особой оптимизирующей магии выкидывает пункты 1, 3 и 4 нафиг. А пункт 2 инлайнит, заменяя вызов конструктора прямой подстановкой его кода. Результат как если бы вы объявили переменную вне цикла.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 09:15  [ТС]     Случайные числа с заданным распределением #18
Цитата Сообщение от Renji Посмотреть сообщение
1) В начале итерации в стеке выделяется память под normal_distribution.
2) Вызывается функция "конструктор", которой передается указатель на память normal_distribution.
3) В конце итерации вызывается функция "деструктор", которой передается указатель на память normal_distribution.
4) Выделенная под normal_distribution память освобождается.
5) goto 1.
Ну просто отлично. На каждом шагу цикла дёргать выделение/освобождение памяти. Причём, помимо роста/сокращения стека при вызовах функций, которые ни куда не деваются. Не смешно.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
31.07.2015, 09:19     Случайные числа с заданным распределением #19
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну просто отлично. На каждом шагу цикла дёргать выделение/освобождение памяти.
1) Это "выделение-освобождение" - одна операция вычитания/сложения. Колоссальные расходы времени, ага.
2) Еще раз, оптимизатор ее выкинет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 10:53     Случайные числа с заданным распределением
Еще ссылки по теме:

C++ Случайные числа
Случайные числа от 1 до 9 C++
C++ Случайные числа

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 10:53  [ТС]     Случайные числа с заданным распределением #20
Что это:
Цитата Сообщение от zss Посмотреть сообщение
RAND_MAX
?

Добавлено через 36 секунд
Цитата Сообщение от Renji Посмотреть сообщение
1) Это "выделение-освобождение" - одна операция вычитания/сложения. Колоссальные расходы времени, ага.
Без которых можно обойтись. + сама работа конструктора и деструктора.

Добавлено через 18 минут
C:\Projects\Test11\Test11\NormalRanodm.cpp|6|error: 'rand' was not declared in this scope|
.....................
Yandex
Объявления
31.07.2015, 10:53     Случайные числа с заданным распределением
Ответ Создать тему
Опции темы

Текущее время: 06:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru