Загрузка данных
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <random>
using namespace std;
//-------------------------------------------------
// Выбор генератора случайных чисел
//-------------------------------------------------
double getRandom(int mode)
{
if (mode == 1)
{
return (double)rand() / RAND_MAX;
}
else
{
static random_device rd;
static mt19937 gen(rd());
static uniform_real_distribution<> dist(0.0, 1.0);
return dist(gen);
}
}
//-------------------------------------------------
// Тест 1. Матожидание, дисперсия, СКО
//-------------------------------------------------
void statisticsTest(int mode)
{
int N;
cout << "\nВведите N: ";
cin >> N;
vector<double> numbers(N);
double sum = 0.0;
for (int i = 0; i < N; i++)
{
numbers[i] = getRandom(mode);
sum += numbers[i];
}
double mean = sum / N;
double variance = 0.0;
for (int i = 0; i < N; i++)
{
variance += pow(numbers[i] - mean, 2);
}
variance /= N;
double stddev = sqrt(variance);
cout << fixed << setprecision(6);
cout << "\nМатематическое ожидание = "
<< mean << endl;
cout << "Дисперсия = "
<< variance << endl;
cout << "Среднеквадратическое отклонение = "
<< stddev << endl;
}
//-------------------------------------------------
// Тест 2. Случайные точки
//-------------------------------------------------
void pointsTest(int mode)
{
int N;
cout << "\nВведите количество точек N: ";
cin >> N;
cout << "\nКоординаты точек:\n";
for (int i = 0; i < N; i++)
{
double x = getRandom(mode);
double y = getRandom(mode);
cout << "("
<< fixed << setprecision(4)
<< x << ", "
<< y << ")\n";
}
}
//-------------------------------------------------
// Тест 3. Гистограмма
//-------------------------------------------------
void histogramTest(int mode)
{
int N, M;
cout << "\nВведите N: ";
cin >> N;
cout << "Введите M: ";
cin >> M;
vector<int> histogram(M, 0);
for (int i = 0; i < N; i++)
{
double value = getRandom(mode);
int interval = (int)(value * M);
if (interval == M)
interval = M - 1;
histogram[interval]++;
}
cout << "\nГистограмма:\n";
for (int i = 0; i < M; i++)
{
double left = (double)i / M;
double right = (double)(i + 1) / M;
cout << fixed << setprecision(2);
cout << "[" << left
<< "; "
<< right
<< ") ";
for (int j = 0; j < histogram[i]; j++)
cout << "*";
cout << " (" << histogram[i] << ")";
cout << endl;
}
}
//-------------------------------------------------
// Тест 4. Тест серий
//-------------------------------------------------
void seriesTest(int mode)
{
int N;
cout << "\nВведите количество испытаний N: ";
cin >> N;
int currentBit;
int previousBit;
int currentLength = 1;
int maxZeroSeries = 0;
int maxOneSeries = 0;
previousBit = (getRandom(mode) < 0.5) ? 0 : 1;
for (int i = 1; i < N; i++)
{
currentBit = (getRandom(mode) < 0.5) ? 0 : 1;
if (currentBit == previousBit)
{
currentLength++;
}
else
{
if (previousBit == 0)
maxZeroSeries = max(maxZeroSeries,
currentLength);
else
maxOneSeries = max(maxOneSeries,
currentLength);
currentLength = 1;
}
previousBit = currentBit;
}
if (previousBit == 0)
maxZeroSeries = max(maxZeroSeries,
currentLength);
else
maxOneSeries = max(maxOneSeries,
currentLength);
cout << "\nМаксимальная серия нулей = "
<<maxZeroSeries << endl;
cout << "Максимальная серия единиц = "
<< maxOneSeries << endl;
}
//-------------------------------------------------
// Главное меню
//-------------------------------------------------
int main()
{
setlocale(LC_ALL, "Russian");
srand((unsigned)time(nullptr));
int generator;
int choice;
cout << "Проверка качества генераторов случайных чисел\n";
cout << "\nВыберите генератор:"
<< "\n1 - rand()"
<< "\n2 - mt19937"
<< "\nВаш выбор: ";
cin >> generator;
do
{
cout << "\n========== МЕНЮ ==========\n";
cout << "1. Математическое ожидание, дисперсия, СКО\n";
cout << "2. Случайные точки\n";
cout << "3. Гистограмма распределения\n";
cout << "4. Тест серий\n";
cout << "0. Выход\n";
cout << "Ваш выбор: ";
cin >> choice;
switch (choice)
{
case 1:
statisticsTest(generator);
break;
case 2:
pointsTest(generator);
break;
case 3:
histogramTest(generator);
break;
case 4:
seriesTest(generator);
break;
case 0:
cout << "\nЗавершение программы.\n";
break;
default:
cout << "\nНеверный пункт меню!\n";
}
} while (choice != 0);
return 0;
}