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

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

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

31.07.2015, 06:19. Просмотров 1031. Ответов 21
Метки нет (Все метки)

Что то не соображу, как сделать генератор случайных чисел с плавающей запятой, имеющий заданное, например нормальное распределение. Синтаксис
C++
1
x=NormRandom(M, D);
, где M - математическое ожидание, D - дисперсия. Понятно, что числа будут псевдослучайными, а не истинно случайными, но требуется хоты бы имитация нормального распределения с заданными параметрами.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,189
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
31.07.2015, 06:31     Случайные числа с заданным распределением #3
taras atavin, std::normal_distribution из c++11
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
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
31.07.2015, 06:45     Случайные числа с заданным распределением #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это:
Шаблонная магия создающая генератор случайных чисел.
Цитата Сообщение от taras atavin Посмотреть сообщение
А где ж параметры распределения то?
Строчкой выше, в конструкторе генератора созданного шаблонной магией.
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое Sigma и как она связана с дисперсией?
Очевидно, корень квадратный из дисперсии. "Правило трех сигм" ничего не говорит?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:04  [ТС]     Случайные числа с заданным распределением #6
Цитата Сообщение от Renji Посмотреть сообщение
Шаблонная магия создающая генератор случайных чисел.
Что это шаблон я и сам вижу. Какая величина здесь декларирована?

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

Добавлено через 21 секунду
Цитата Сообщение от Renji Посмотреть сообщение
"Правило трех сигм" ничего не говорит?
Нет конечно.
Renji
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
31.07.2015, 07:08     Случайные числа с заданным распределением #7
Цитата Сообщение от 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
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
31.07.2015, 07:31     Случайные числа с заданным распределением #9
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем мне на каждое распределение конструировать отдельную переменную?
Чтобы хранить в ней два параметра распределения. Хранить их отдельно от генератора не по ООП-феншую.
Цитата Сообщение от taras atavin Посмотреть сообщение
передавать уже поздно, констуктор давно отработал
Вам религия запрещает поставить std::normal_distribution<double> distribution(5.0,2.0); после cin?
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
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:40  [ТС]     Случайные числа с заданным распределением #12
Цитата Сообщение от Renji Посмотреть сообщение
Не тупите.
Так я и не умею.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
атем, что эти две величины сдохнут после ближайшего return, а генератор создается на века. Хотя, конечно, ситуации бывают разные.
Что за бред? Эти две величины отлично могут быть статик, а то и глобальными, а генератор нужен только в части одной функции и до ретона доживать не обязан.
Renji
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
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
Ушёл с форума.
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);
}
И?...............
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 08:04     Случайные числа с заданным распределением
Еще ссылки по теме:
случайные числа C++
случайные числа от -10 до 10 C++
C++ случайные числа от -10 до 10
Случайные числа от 1 до 9 C++
Случайные числа C++

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

Или воспользуйтесь поиском по форуму:
Renji
1878 / 1276 / 290
Регистрация: 05.06.2014
Сообщений: 3,642
31.07.2015, 08:04     Случайные числа с заданным распределением #15
Цитата Сообщение от taras atavin Посмотреть сообщение
И?...............
И декларация всего одна. Для остального есть оптимизатор.
Yandex
Объявления
31.07.2015, 08:04     Случайные числа с заданным распределением
Ответ Создать тему
Опции темы

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