Загрузка данных
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}";
}
}
}