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

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

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

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

31.07.2015, 06:19. Просмотров 1066. Ответов 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++):

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

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

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

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

случайные числа - C++
как заполнить массив случайными числами например от -50 до 50 void generate(int mas,int n){ for(int i=0;i<n;i++) mas=(rand()%50)-50; ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 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
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
31.07.2015, 06:31 #3
taras atavin, std::normal_distribution из c++11
0
taras atavin
Ушёл с форума.
3569 / 1753 / 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
?
0
Renji
1921 / 1319 / 298
Регистрация: 05.06.2014
Сообщений: 3,781
31.07.2015, 06:45 #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Что это:
Шаблонная магия создающая генератор случайных чисел.
Цитата Сообщение от taras atavin Посмотреть сообщение
А где ж параметры распределения то?
Строчкой выше, в конструкторе генератора созданного шаблонной магией.
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое Sigma и как она связана с дисперсией?
Очевидно, корень квадратный из дисперсии. "Правило трех сигм" ничего не говорит?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.07.2015, 07:04  [ТС] #6
Цитата Сообщение от Renji Посмотреть сообщение
Шаблонная магия создающая генератор случайных чисел.
Что это шаблон я и сам вижу. Какая величина здесь декларирована?

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

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

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
атем, что эти две величины сдохнут после ближайшего return, а генератор создается на века. Хотя, конечно, ситуации бывают разные.
Что за бред? Эти две величины отлично могут быть статик, а то и глобальными, а генератор нужен только в части одной функции и до ретона доживать не обязан.
0
Renji
1921 / 1319 / 298
Регистрация: 05.06.2014
Сообщений: 3,781
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
Ушёл с форума.
3569 / 1753 / 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);
}
И?...............
0
Renji
1921 / 1319 / 298
Регистрация: 05.06.2014
Сообщений: 3,781
31.07.2015, 08:04 #15
Цитата Сообщение от taras atavin Посмотреть сообщение
И?...............
И декларация всего одна. Для остального есть оптимизатор.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 08:04
Привет! Вот еще темы с ответами:

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

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

Случайные числа - C++
Написать функцию, которая подсчитует сколько раз заданое число встречается в последовательности N случайных чисел.

случайные числа - C++
rand() в VS имеет диапазон от 0 до 32768? даже изменение RAND_MAX ничего не повысит верхний уровень?


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

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

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