Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

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

Что то не соображу, как сделать генератор случайных чисел с плавающей запятой, имеющий заданное, например нормальное распределение. Синтаксис
C++
1
x=NormRandom(M, D);
, где M - математическое ожидание, D - дисперсия. Понятно, что числа будут псевдослучайными, а не истинно случайными, но требуется хоты бы имитация нормального распределения с заданными параметрами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 06:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Случайные числа с заданным распределением (C++):

генерация случайных чисел с заданным распределением вероятности
Здравствуйте. Нужна ваша помощь. Необходим алгоритм или же пример. где...

Нужно чтобы случайные числа вставали в конец массива,а не удаляли числа
#include <iostream> using namespace std; void main() { setlocale(LC_ALL,...

Случайные числа. if, else
Подскажите, как мне сделать так. чтобы показывало рандомное число и выводило...

случайные числа
как заполнить массив случайными числами например от -50 до 50 void...

Случайные числа от -10 до 10
сижу я значит и не могу вывести случайные числа от -10 до 10! Получается только...

случайные числа в с++
День добрый . Задание : игра в кубики с компом . Не могу понять как сделать для...

21
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 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;
}
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
31.07.2015, 06:31 #3
taras atavin, std::normal_distribution из c++11
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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
?
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
31.07.2015, 06:45 #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это:
Шаблонная магия создающая генератор случайных чисел.
Цитата Сообщение от taras atavin Посмотреть сообщение
А где ж параметры распределения то?
Строчкой выше, в конструкторе генератора созданного шаблонной магией.
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое Sigma и как она связана с дисперсией?
Очевидно, корень квадратный из дисперсии. "Правило трех сигм" ничего не говорит?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 07:04  [ТС] #6
Цитата Сообщение от Renji Посмотреть сообщение
Шаблонная магия создающая генератор случайных чисел.
Что это шаблон я и сам вижу. Какая величина здесь декларирована?

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

Добавлено через 21 секунду
Цитата Сообщение от Renji Посмотреть сообщение
"Правило трех сигм" ничего не говорит?
Нет конечно.
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
31.07.2015, 07:08 #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это шаблон я и сам вижу. Какая величина здесь декларирована?
А в документацию посмотреть? Первый аргумент - мат-ожидание, второй - сигма.
Цитата Сообщение от taras atavin Посмотреть сообщение
А если я не хочу для каждого распределения заводить отдельную декларацию? А если параметры распределения вводятся с клавиатуры пользователем?
И кто вам мешает передать введенные параметры в конструктор?
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет конечно.
Значит, учить матчасть.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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;
/*  передавать уже поздно, констуктор давно отработал*/.
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
31.07.2015, 07:31 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем мне на каждое распределение конструировать отдельную переменную?
Чтобы хранить в ней два параметра распределения. Хранить их отдельно от генератора не по ООП-феншую.
Цитата Сообщение от taras atavin Посмотреть сообщение
передавать уже поздно, констуктор давно отработал
Вам религия запрещает поставить std::normal_distribution<double> distribution(5.0,2.0); после cin?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 07:34  [ТС] #10
Цитата Сообщение от Renji Посмотреть сообщение
Чтобы хранить в ней два параметра распределения.
Зачем? Для этого уже есть две величины.
Цитата Сообщение от Renji Посмотреть сообщение
Хранить их отдельно от генератора не по ООП-феншую.
Вот только здесь то он каким боком? Зато необходима процедурная парадигма.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Вам религия запрещает поставить std::normal_distribution<double> distribution(5.0,2.0); после cin?
После чего его ещё поставить? После ссылки? Или после закрывающей фигурной скобки всей функции? Я раз двести в одной функции буду вводить параметры разнообразных нормальных распределений, для каждой комбинации гонять цикл на миллионы шагов и получать значения одной и той же величины x, каждый раз разные. Нафига мне двести отдельных деклараций задающих распределение величин?
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
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);
//что-то генерируем в генераторе
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 07:40  [ТС] #12
Цитата Сообщение от Renji Посмотреть сообщение
Не тупите.
Так я и не умею.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
атем, что эти две величины сдохнут после ближайшего return, а генератор создается на века. Хотя, конечно, ситуации бывают разные.
Что за бред? Эти две величины отлично могут быть статик, а то и глобальными, а генератор нужен только в части одной функции и до ретона доживать не обязан.
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
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);
}
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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);
}
И?...............
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
31.07.2015, 08:04 #15
Цитата Сообщение от taras atavin Посмотреть сообщение
И?...............
И декларация всего одна. Для остального есть оптимизатор.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 08:31  [ТС] #16
Цитата Сообщение от Renji Посмотреть сообщение
И декларация всего одна.
Вижу, что одна. Но это же не бейсик, где можно один и тот же массив декларировать двести раз одной и той же строчкой по разу на каждом шагу цикла и он будет динамически менять свою размерность. Сколько здесь величин?
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
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 инлайнит, заменяя вызов конструктора прямой подстановкой его кода. Результат как если бы вы объявили переменную вне цикла.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
31.07.2015, 09:15  [ТС] #18
Цитата Сообщение от Renji Посмотреть сообщение
1) В начале итерации в стеке выделяется память под normal_distribution.
2) Вызывается функция "конструктор", которой передается указатель на память normal_distribution.
3) В конце итерации вызывается функция "деструктор", которой передается указатель на память normal_distribution.
4) Выделенная под normal_distribution память освобождается.
5) goto 1.
Ну просто отлично. На каждом шагу цикла дёргать выделение/освобождение памяти. Причём, помимо роста/сокращения стека при вызовах функций, которые ни куда не деваются. Не смешно.
0
Renji
2142 / 1501 / 457
Регистрация: 05.06.2014
Сообщений: 4,339
31.07.2015, 09:19 #19
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну просто отлично. На каждом шагу цикла дёргать выделение/освобождение памяти.
1) Это "выделение-освобождение" - одна операция вычитания/сложения. Колоссальные расходы времени, ага.
2) Еще раз, оптимизатор ее выкинет.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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|
.....................
0
31.07.2015, 10:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 10:53
Привет! Вот еще темы с решениями:

Случайные числа
Можно ли генерировать случайные числа типа float с помощью rand()?

случайные числа
rand() в VS имеет диапазон от 0 до 32768? даже изменение RAND_MAX ничего не...

Случайные числа
Доброго времени суток! Возможно ли сделать так, чтобы выпадали в случайном...

Случайные числа
как выполнить генератор случайных чисел генерировал любое число и присваивал...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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