소개
이 실습에서는 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("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() 함수 활용입니다. 프로그램은 다음 단계로 진행하기 전에 입력된 값과 확률을 확인하기 위해 출력합니다.



