Введение
В этом лабораторном практикуме вы научитесь вычислять математическое ожидание дискретного распределения на языке программирования C. Практикум охватывает следующие шаги: чтение значений и вероятностей, вычисление математического ожидания путём суммирования произведения каждого значения и его соответствующей вероятности, и вывод конечного результата. Программа позволяет пользователям ввести количество исходов, значения и их соответствующие вероятности, а затем отображает введённые значения для проверки. Этот практикум призван обеспечить практическое понимание вероятности и комбинаторики с использованием языка C, что является ценным навыком в различных областях, таких как анализ данных, машинное обучение и принятие решений.
Чтение значений и вероятностей
В этом шаге вы узнаете, как читать значения и вероятности для вычисления математического ожидания дискретного распределения в C. Мы создадим программу, которая позволит пользователям вводить несколько значений и соответствующие им вероятности.
Сначала создадим новый файл C в каталоге ~/project:
cd ~/project
nano expected_value.c
Теперь напишем начальный код для чтения значений и вероятностей:
#include <stdio.h>
#define MAX_OUTCOMES 10
int main() {
double values[MAX_OUTCOMES];
double probabilities[MAX_OUTCOMES];
int num_outcomes;
printf("Enter the number of outcomes (max %d): ", MAX_OUTCOMES);
scanf("%d", &num_outcomes);
// Ввод значений
printf("Enter the values:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Value %d: ", i + 1);
scanf("%lf", &values[i]);
}
// Ввод вероятностей
printf("Enter the probabilities:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Probability %d: ", i + 1);
scanf("%lf", &probabilities[i]);
}
// Вывод введённых данных для проверки
printf("\nInput Values:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Value %d: %.2f, Probability %d: %.2f\n",
i + 1, values[i], i + 1, probabilities[i]);
}
return 0;
}
Компилируем и запускаем программу:
gcc expected_value.c -o expected_value
./expected_value
Пример вывода:
Enter the number of outcomes (max 10): 3
Enter the values:
Value 1: 10
Value 2: 20
Value 3: 30
Enter the probabilities:
Probability 1: 0.2
Probability 2: 0.5
Probability 3: 0.3
Input Values:
Value 1: 10.00, Probability 1: 0.20
Value 2: 20.00, Probability 2: 0.50
Value 3: 30.00, Probability 3: 0.30
Ключевые моменты для понимания:
- Мы используем массивы для хранения значений и вероятностей
MAX_OUTCOMESопределяет максимальное количество возможных исходовscanf()используется для чтения пользовательского ввода значений и вероятностей- Мы выводим введённые данные для проверки правильности ввода.
Сумма (значение*вероятность) по всем исходам
В этом шаге вы расширите предыдущую программу для вычисления математического ожидания, вычислив сумму каждого значения, умноженного на его вероятность.
Откройте существующий файл и измените код:
cd ~/project
nano expected_value.c
Обновите код для вычисления математического ожидания:
#include <stdio.h>
#define MAX_OUTCOMES 10
int main() {
double values[MAX_OUTCOMES];
double probabilities[MAX_OUTCOMES];
int num_outcomes;
double expected_value = 0.0;
printf("Enter the number of outcomes (max %d): ", MAX_OUTCOMES);
scanf("%d", &num_outcomes);
// Ввод значений
printf("Enter the values:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Value %d: ", i + 1);
scanf("%lf", &values[i]);
}
// Ввод вероятностей
printf("Enter the probabilities:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Probability %d: ", i + 1);
scanf("%lf", &probabilities[i]);
}
// Вычисление математического ожидания
for (int i = 0; i < num_outcomes; i++) {
expected_value += values[i] * probabilities[i];
}
// Вывод результатов
printf("\nПодробности вычислений:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Value %d: %.2f * Probability %d: %.2f = %.2f\n",
i + 1, values[i], i + 1, probabilities[i],
values[i] * probabilities[i]);
}
printf("\nМатематическое ожидание: %.2f\n", expected_value);
return 0;
}
Компилируем и запускаем обновлённую программу:
gcc expected_value.c -o expected_value
./expected_value
Пример вывода:
Enter the number of outcomes (max 10): 3
Enter the values:
Value 1: 10
Value 2: 20
Value 3: 30
Enter the probabilities:
Probability 1: 0.2
Probability 2: 0.5
Probability 3: 0.3
Подробности вычислений:
Value 1: 10.00 * Probability 1: 0.20 = 2.00
Value 2: 20.00 * Probability 2: 0.50 = 10.00
Value 3: 30.00 * Probability 3: 0.30 = 9.00
Математическое ожидание: 21.00
Ключевые моменты для понимания:
- Мы вводим
expected_valueдля хранения суммы значение * вероятность - Цикл
forвычисляет каждый член и накапливает сумму - Мы выводим подробные шаги вычисления, чтобы показать, как вычисляется математическое ожидание
- Вклад каждого исхода показан как (значение * вероятность)
Вывод Математического Ожидания
В этом заключительном шаге вы улучшите программу, чтобы обеспечить более подробный вывод и повысить удобство использования при отображении математического ожидания.
Откройте существующий файл и внесите окончательные изменения:
cd ~/project
nano expected_value.c
Обновите код с улучшенным форматированием и проверкой ошибок:
#include <stdio.h>
#define MAX_OUTCOMES 10
int main() {
double values[MAX_OUTCOMES];
double probabilities[MAX_OUTCOMES];
int num_outcomes;
double expected_value = 0.0;
double total_probability = 0.0;
printf("Калькулятор Математического Ожидания\n");
printf("=====================================\n");
// Ввод количества исходов
do {
printf("Введите количество исходов (1-%d): ", MAX_OUTCOMES);
scanf("%d", &num_outcomes);
if (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES) {
printf("Неверное количество исходов. Пожалуйста, попробуйте снова.\n");
}
} while (num_outcomes < 1 || num_outcomes > MAX_OUTCOMES);
// Ввод значений
printf("\nВведите значения:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Значение %d: ", i + 1);
scanf("%lf", &values[i]);
}
// Ввод вероятностей с проверкой
printf("\nВведите вероятности:\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Вероятность %d: ", i + 1);
scanf("%lf", &probabilities[i]);
total_probability += probabilities[i];
}
// Проверка суммы вероятностей
if (total_probability < 0.99 || total_probability > 1.01) {
printf("\nПРЕДУПРЕЖДЕНИЕ: Вероятности не суммируются до 1.0 (текущая сумма: %.2f)\n",
total_probability);
}
// Вычисление математического ожидания
for (int i = 0; i < num_outcomes; i++) {
expected_value += values[i] * probabilities[i];
}
// Подробный вывод результатов
printf("\n--- Подробности вычислений ---\n");
for (int i = 0; i < num_outcomes; i++) {
printf("Исход %d: Значение = %.2f, Вероятность = %.2f\n",
i + 1, values[i], probabilities[i]);
printf(" Вклад: %.2f * %.2f = %.2f\n",
values[i], probabilities[i], values[i] * probabilities[i]);
}
// Окончательный вывод математического ожидания
printf("\n=== Математическое Ожидание ===\n");
printf("E(X) = %.2f\n", expected_value);
return 0;
}
Компилируем и запускаем окончательную программу:
gcc expected_value.c -o expected_value
./expected_value
Пример вывода:
Калькулятор Математического Ожидания
=====================================
Введите количество исходов (1-10): 3
Введите значения:
Значение 1: 10
Значение 2: 20
Значение 3: 30
Введите вероятности:
Вероятность 1: 0.2
Вероятность 2: 0.5
Вероятность 3: 0.3
--- Подробности вычислений ---
Исход 1: Значение = 10.00, Вероятность = 0.20
Вклад: 10.00 * 0.20 = 2.00
Исход 2: Значение = 20.00, Вероятность = 0.50
Вклад: 20.00 * 0.50 = 10.00
Исход 3: Значение = 30.00, Вероятность = 0.30
Вклад: 30.00 * 0.30 = 9.00
=== Математическое Ожидание ===
E(X) = 21.00
Основные улучшения:
- Добавлена проверка ввода количества исходов
- Проверена сумма вероятностей
- Улучшено форматирование вывода
- Показаны индивидуальные вклады исходов
- Чётко отображено окончательное значение математического ожидания
Резюме
В этом лабораторном практикуме вы научитесь вводить значения и вероятности, а затем вычислять математическое ожидание дискретного распределения на языке C. Сначала вы создадите программу, которая позволит пользователям вводить несколько значений и соответствующие им вероятности. Затем вы узнаете, как суммировать произведение каждого значения и его вероятности для вычисления математического ожидания. Наконец, вы выведете вычисленное значение математического ожидания.
Ключевые моменты, охваченные в этом практикуме, включают использование массивов для хранения значений и вероятностей, определение максимального количества возможных исходов и использование функции scanf() для чтения пользовательского ввода. Программа гарантирует, что вводимые значения и вероятности выводятся для проверки перед переходом к следующему шагу.



