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