用 C 语言计算离散分布的期望值

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何用C编程语言计算离散分布的期望值。本实验涵盖以下步骤:读取值和概率,通过将每个值与其相应概率的乘积相加来计算期望值,以及打印最终结果。该程序允许用户输入结果数量、值及其各自的概率,然后显示输入值以供验证。本实验旨在通过C语言提供对概率和组合数学的实际理解,这在数据分析、机器学习和决策等各个领域都是一项宝贵的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/for_loop -.-> lab-435345{{"用 C 语言计算离散分布的期望值"}} c/arrays -.-> lab-435345{{"用 C 语言计算离散分布的期望值"}} c/math_functions -.-> lab-435345{{"用 C 语言计算离散分布的期望值"}} c/user_input -.-> lab-435345{{"用 C 语言计算离散分布的期望值"}} c/output -.-> lab-435345{{"用 C 语言计算离散分布的期望值"}} end

读取值和概率

在这一步中,你将学习如何读取用于计算C语言中离散分布期望值的值和概率。我们将创建一个程序,允许用户输入多个值及其相应的概率。

首先,让我们在 ~/project 目录中创建一个新的C文件:

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("输入结果数量(最大 %d):", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // 输入值
    printf("输入值:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("值 %d:", i + 1);
        scanf("%lf", &values[i]);
    }

    // 输入概率
    printf("输入概率:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("概率 %d:", i + 1);
        scanf("%lf", &probabilities[i]);
    }

    // 打印输入以供验证
    printf("\n输入值:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("值 %d:%.2f,概率 %d:%.2f\n",
               i + 1, values[i], i + 1, probabilities[i]);
    }

    return 0;
}

编译并运行程序:

gcc expected_value.c -o expected_value
./expected_value

示例输出:

输入结果数量(最大 10):3
输入值:
值 1:10
值 2:20
值 3:30
输入概率:
概率 1:0.2
概率 2:0.5
概率 3:0.3

输入值:
值 1:10.00,概率 1:0.20
值 2:20.00,概率 2:0.50
值 3:30.00,概率 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("输入结果数量(最大 %d):", MAX_OUTCOMES);
    scanf("%d", &num_outcomes);

    // 输入值
    printf("输入值:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("值 %d:", i + 1);
        scanf("%lf", &values[i]);
    }

    // 输入概率
    printf("输入概率:\n");
    for (int i = 0; i < num_outcomes; i++) {
        printf("概率 %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("值 %d:%.2f * 概率 %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

示例输出:

输入结果数量(最大 10):3
输入值:
值 1:10
值 2:20
值 3:30
输入概率:
概率 1:0.2
概率 2:0.5
概率 3:0.3

计算详情:
值 1:10.00 * 概率 1:0.20 = 2.00
值 2:20.00 * 概率 2:0.50 = 10.00
值 3:30.00 * 概率 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() 函数读取用户输入。在进入下一步之前,程序会确保打印输入的值和概率以供验证。