Загрузка данных


#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;
}