Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/88: Рейтинг темы: голосов - 88, средняя оценка - 4.92
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

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

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

Author24 — интернет-сервис помощи студентам
Что то не соображу, как сделать генератор случайных чисел с плавающей запятой, имеющий заданное, например нормальное распределение. Синтаксис
C++
1
x=NormRandom(M, D);
, где M - математическое ожидание, D - дисперсия. Понятно, что числа будут псевдослучайными, а не истинно случайными, но требуется хоты бы имитация нормального распределения с заданными параметрами.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2015, 06:19
Ответы с готовыми решениями:

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

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

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

Случайные числа в C++
нужно присвоить переменной числа от -50 до 50, как сделать?

21
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.07.2015, 06:31 3
taras atavin, std::normal_distribution из c++11
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
31.07.2015, 06:45 5
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это:
Шаблонная магия создающая генератор случайных чисел.
Цитата Сообщение от taras atavin Посмотреть сообщение
А где ж параметры распределения то?
Строчкой выше, в конструкторе генератора созданного шаблонной магией.
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое Sigma и как она связана с дисперсией?
Очевидно, корень квадратный из дисперсии. "Правило трех сигм" ничего не говорит?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.07.2015, 07:04  [ТС] 6
Цитата Сообщение от Renji Посмотреть сообщение
Шаблонная магия создающая генератор случайных чисел.
Что это шаблон я и сам вижу. Какая величина здесь декларирована?

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

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

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
Вам религия запрещает поставить std::normal_distribution<double> distribution(5.0,2.0); после cin?
После чего его ещё поставить? После ссылки? Или после закрывающей фигурной скобки всей функции? Я раз двести в одной функции буду вводить параметры разнообразных нормальных распределений, для каждой комбинации гонять цикл на миллионы шагов и получать значения одной и той же величины x, каждый раз разные. Нафига мне двести отдельных деклараций задающих распределение величин?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.07.2015, 07:40  [ТС] 12
Цитата Сообщение от Renji Посмотреть сообщение
Не тупите.
Так я и не умею.

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
атем, что эти две величины сдохнут после ближайшего return, а генератор создается на века. Хотя, конечно, ситуации бывают разные.
Что за бред? Эти две величины отлично могут быть статик, а то и глобальными, а генератор нужен только в части одной функции и до ретона доживать не обязан.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
31.07.2015, 08:04 15
Цитата Сообщение от taras atavin Посмотреть сообщение
И?...............
И декларация всего одна. Для остального есть оптимизатор.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.07.2015, 08:31  [ТС] 16
Цитата Сообщение от Renji Посмотреть сообщение
И декларация всего одна.
Вижу, что одна. Но это же не бейсик, где можно один и тот же массив декларировать двести раз одной и той же строчкой по разу на каждом шагу цикла и он будет динамически менять свою размерность. Сколько здесь величин?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.07.2015, 09:15  [ТС] 18
Цитата Сообщение от Renji Посмотреть сообщение
1) В начале итерации в стеке выделяется память под normal_distribution.
2) Вызывается функция "конструктор", которой передается указатель на память normal_distribution.
3) В конце итерации вызывается функция "деструктор", которой передается указатель на память normal_distribution.
4) Выделенная под normal_distribution память освобождается.
5) goto 1.
Ну просто отлично. На каждом шагу цикла дёргать выделение/освобождение памяти. Причём, помимо роста/сокращения стека при вызовах функций, которые ни куда не деваются. Не смешно.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
31.07.2015, 09:19 19
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну просто отлично. На каждом шагу цикла дёргать выделение/освобождение памяти.
1) Это "выделение-освобождение" - одна операция вычитания/сложения. Колоссальные расходы времени, ага.
2) Еще раз, оптимизатор ее выкинет.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2015, 10:53
Помогаю со студенческими работами здесь

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

Случайные числа
Необходимо написать программу, которая будет генерировать случайную величину от 0 до 1 (включая 0 и...

Случайные числа
Подскажите функцию(или класс а вней функцию) для генерирования случайных чисел аналог Random.Next()...

Случайные числа
Всем привет! Мне нужно сгенерировать действительное случайное число в диапазоне от нуля до 1. Читал...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru