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


https://webmaster-tools.online/bins/c1d7effc4e46e9ec5c2afda99a506227using System;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace LabStatVero
{
    public partial class Form1 : Form
    {
        Random rnd = new Random();

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonCalculate_Click(object sender, EventArgs e)
        {
            // Считываем параметры
            if (!int.TryParse(textBoxN.Text, out int N) || 
                !int.TryParse(textBoxM.Text, out int M) || 
                !int.TryParse(textBoxK.Text, out int K))
            {
                MessageBox.Show("Введите корректные целые числа для N, M и K.");
                return;
            }

            // --- ЗАДАНИЕ 1: Равномерное распределение ---
            double[] sampleUniform = new double[N];
            for (int i = 0; i < N; i++)
            {
                sampleUniform[i] = rnd.NextDouble(); // от 0 до 1
            }

            // --- ЗАДАНИЕ 2: Сумма M равномерных распределений ---
            double[] sampleSum = new double[N];
            for (int i = 0; i < N; i++)
            {
                double sum = 0;
                for (int j = 0; j < M; j++) sum += rnd.NextDouble();
                sampleSum[i] = sum;
            }

            // Очищаем график перед новой отрисовкой
            chart1.Series.Clear();

            // Создаем два ряда для графика (чтобы показать обе гистограммы, либо можно выводить их по очереди)
            Series seriesUniform = new Series("Равномерное (Задание 1)") { ChartType = SeriesChartType.Column };
            Series seriesSum = new Series("Сумма M (Задание 2)") { ChartType = SeriesChartType.Column };
            
            // Ширина столбцов для визуальной красоты гистограммы
            seriesUniform["PointWidth"] = "1";
            seriesSum["PointWidth"] = "1";

            chart1.Series.Add(seriesUniform);
            chart1.Series.Add(seriesSum);

            // Обрабатываем обе выборки
            string stats1 = ProcessSample(sampleUniform, K, seriesUniform, "Выборка 1 (Равномерное)");
            string stats2 = ProcessSample(sampleSum, K, seriesSum, "Выборка 2 (Сумма M случайных)");

            // Вывод результатов
            labelStats.Text = stats1 + "\n\n" + stats2;
        }

        // --- ЗАДАНИЕ 3: Вычисление характеристик и построение гистограммы ---
        private string ProcessSample(double[] data, int K, Series series, string title)
        {
            int N = data.Length;
            double min = data.Min();
            double max = data.Max();
            
            // Длина одного интервала
            double h = (max - min) / K;
            
            // Массив частот попадания в интервалы
            int[] frequencies = new int[K];

            // Заполнение частот
            foreach (double val in data)
            {
                int index = (int)((val - min) / h);
                if (index == K) index--; // Обработка крайнего максимального элемента
                frequencies[index]++;
            }

            // Построение гистограммы
            for (int i = 0; i < K; i++)
            {
                double intervalMid = min + i * h + h / 2.0; // Середина интервала для оси X
                series.Points.AddXY(Math.Round(intervalMid, 3), frequencies[i]);
            }

            // --- ЧИСЛОВЫЕ ХАРАКТЕРИСТИКИ ---

            // 1. Среднее
            double mean = data.Average();

            // 2. Выборочная дисперсия
            double variance = data.Sum(x => Math.Pow(x - mean, 2)) / (N - 1);

            // 3. Медиана по всей выборке (точная)
            var sortedData = data.OrderBy(x => x).ToArray();
            double exactMedian;
            if (N % 2 == 0)
                exactMedian = (sortedData[N / 2 - 1] + sortedData[N / 2]) / 2.0;
            else
                exactMedian = sortedData[N / 2];

            // 4. Мода по интервальному ряду
            int maxFreq = frequencies.Max();
            int mIndex = Array.IndexOf(frequencies, maxFreq); // Индекс модального интервала
            double x0_mod = min + mIndex * h; // Нижняя граница модального интервала
            double fm = frequencies[mIndex];
            double fm_prev = mIndex > 0 ? frequencies[mIndex - 1] : 0;
            double fm_next = mIndex < K - 1 ? frequencies[mIndex + 1] : 0;
            
            // Формула интервальной моды
            double intervalMode = x0_mod + h * ((fm - fm_prev) / ((fm - fm_prev) + (fm - fm_next)));

            // 5. Медиана по интервальному ряду
            int sumF = 0;
            int medIndex = 0;
            for (int i = 0; i < K; i++)
            {
                sumF += frequencies[i];
                if (sumF >= (double)N / 2) // Ищем медианный интервал
                {
                    medIndex = i;
                    break;
                }
            }
            double x0_med = min + medIndex * h; // Нижняя граница медианного интервала
            double Sm_prev = sumF - frequencies[medIndex]; // Накопленная частота до медианного
            double f_med = frequencies[medIndex]; // Частота медианного
            
            // Формула интервальной медианы
            double intervalMedian = x0_med + h * ((N / 2.0 - Sm_prev) / f_med);

            // Форматируем вывод
            return $"{title}:\n" +
                   $"Среднее: {mean:F4}\n" +
                   $"Дисперсия: {variance:F4}\n" +
                   $"Медиана (точная): {exactMedian:F4}\n" +
                   $"Медиана (интерв.): {intervalMedian:F4}\n" +
                   $"Мода (интерв.): {intervalMode:F4}";
        }
    }
}