БлогNot. C++: генерируем случайные числа для основных распределений

C++: генерируем случайные числа для основных распределений

Массив равномерно распределённых случайных чисел относительно "новыми" средствами библиотеки <random> уже генерировался вот здесь.

Если нужны другие распределения, а также хочется изобразить хотя бы самую примитивную гистограмму из "звёздочек" в консоли, поможет приложенный пример. В нём генерируется нормальное распределение с параметрами (0,1), сами числа сохраняются в массиве numbers. Чтобы получить другие часто нужные распределения - экспоненциальное и равномерное, раскомментируйте их фрагменты кода в многострочных комментариях /* ... */ вместо имеющегося фрагмента для нормального распределения.

Код проверен в Visual Studio 2015.

#include <iostream>
#include <string>
#include <clocale>
#include <cmath>
#include <cfloat>
#include <random>
using namespace std;

double round1(double x) { return ((x - floor(x)) >= 0.5) ? ceil(x) : floor(x); }

int main() {
 setlocale(LC_ALL, "Russian");

 const int nrolls = 10000;  //Количество экспериментов
 const int nstars = 72; //Макс.высота столбца в "звёздочках"
 const int columns = 10; //Количество столбцов гистограммы
 static int p[columns]; //Данные частот для гистограммы, static - сразу заполнится нулями
 default_random_engine generator; //Собственно генератор
 double numbers[nrolls]; //Сами числа серии
 
 //Нормальное распределение
 double mean = 0.;
 double deviation = 1.;
 normal_distribution <double> distribution(mean, deviation);
 cout << "normal_distribution (" << mean << "," << deviation << "):" << endl;
 
 /*
 //Экспоненциальное распределение
 double lambda = 1.;
 exponential_distribution<double> distribution (lambda);
 cout << "exponential_distribution (" << lambda << "):" << endl;
 */
 
 /*
 //Равномерное распределение
 double a = 0.;
 double b = 1.;
 uniform_real_distribution<double> distribution(a, b);
 cout << "uniform_real_distribution (" << a << "," << b << "):" << endl;
 */

 //Анализ данных и построение гистограммы
 double min = DBL_MAX, max = DBL_MIN;
 for (int i = 0; i<nrolls; i++) {
  numbers[i] = distribution(generator);
  if (numbers[i] < min) min = numbers[i];
  if (numbers[i] > max) max = numbers[i];
 }
 for (int i = 0; i < nrolls; i++) {
  int interval = round1((numbers[i] - min)*(double)(columns - 1) / (max - min));
  interval = (interval<0 ? 0 : interval>columns - 1 ? columns - 1 : interval);
  p[interval]++;
 }
 for (int i = 0; i < columns; i++) {
  cout << string(round1(p[i] * (double)nstars / (double)(nrolls)), '*') << endl;
 }

 cin.sync(); cin.get(); return 0;
}

04.04.2017, 14:27 [5339 просмотров]


теги: c++ random

К этой статье пока нет комментариев, Ваш будет первым