Вычисление Математического Ожидания Дискретного Распределения в C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь вычислять математическое ожидание дискретного распределения на языке программирования 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() для чтения пользовательского ввода. Программа гарантирует, что вводимые значения и вероятности выводятся для проверки перед переходом к следующему шагу.