C 언어로 이항 분포 확률 계산하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍 언어로 이항 확률을 계산하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다.

  1. 이항 확률 계산을 위한 입력 값 (시행 횟수 (n), 성공 확률 (p), 성공 횟수 (k)) 을 읽는 단계입니다.
  2. 이항 확률 공식에서 사용되는 팩토리얼과 조합 (n choose k) 을 계산하는 함수를 구현하는 단계입니다.
  3. 공식 P(X=k) = C(n,k) _ p^k _ (1-p)^(n-k) 를 사용하여 이항 확률을 계산하는 단계입니다. 여기서 C(n,k) 는 조합을 나타냅니다.
  4. 계산된 확률을 출력하는 단계입니다.

이 실습을 마치면 C 에서 이항 확률을 다루는 방법에 대한 확실한 이해를 얻고 다양한 실제 문제에 이러한 개념을 적용할 수 있게 될 것입니다.

n, p, k 입력

이 단계에서는 이항 확률 계산을 위한 입력 값인 n(시행 횟수), p(성공 확률), k(성공 횟수) 를 읽는 방법을 배웁니다.

먼저, 이러한 입력 값을 읽는 C 프로그램을 만들어 보겠습니다.

#include <stdio.h>

int main() {
    int n, k;
    double p;

    printf("시행 횟수 (n) 를 입력하세요: ");
    scanf("%d", &n);

    printf("성공 확률 (p) 를 입력하세요: ");
    scanf("%lf", &p);

    printf("성공 횟수 (k) 를 입력하세요: ");
    scanf("%d", &k);

    printf("입력 값:\n");
    printf("n = %d\n", n);
    printf("p = %.2f\n", p);
    printf("k = %d\n", k);

    return 0;
}

이 파일을 저장하고 컴파일해 보겠습니다.

nano ~/project/binomial_prob.c
gcc ~/project/binomial_prob.c -o ~/project/binomial_prob

프로그램 실행 시 예시 출력:

시행 횟수 (n)를 입력하세요: 10
성공 확률 (p)를 입력하세요: 0.5
성공 횟수 (k)를 입력하세요: 6
입력 값:
n = 10
p = 0.50
k = 6

이 프로그램은 다음을 보여줍니다.

  1. n, p, k 를 위한 변수를 선언하는 방법
  2. scanf()를 사용하여 정수형 및 실수형 입력을 읽는 방법
  3. 입력 값을 확인하기 위해 입력 값을 출력하는 방법

입력 값은 다음을 나타냅니다.

  • n: 독립적인 시행의 총 횟수
  • p: 각 시행에서 성공할 확률
  • k: 확률을 계산하고자 하는 성공 시행의 횟수

P(X=k)=C(n,k)p^k(1-p)^(n-k) 계산

이 단계에서는 이전 프로그램을 확장하여 공식 P(X=k) = C(n,k) _ p^k _ (1-p)^(n-k) 를 사용하여 이항 확률을 계산합니다.

조합 및 이항 확률을 계산하는 함수를 추가합니다.

#include <stdio.h>
#include <math.h>

// 팩토리얼 계산 함수
unsigned long long factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

// 조합 (n choose k) 계산 함수
unsigned long long combinations(int n, int k) {
    return factorial(n) / (factorial(k) * factorial(n - k));
}

// 이항 확률 계산 함수
double binomial_probability(int n, int k, double p) {
    unsigned long long combinations_value = combinations(n, k);
    double probability = combinations_value *
                         pow(p, k) *
                         pow(1 - p, n - k);
    return probability;
}

int main() {
    int n, k;
    double p;

    printf("시행 횟수 (n) 를 입력하세요: ");
    scanf("%d", &n);

    printf("성공 확률 (p) 를 입력하세요: ");
    scanf("%lf", &p);

    printf("성공 횟수 (k) 를 입력하세요: ");
    scanf("%d", &k);

    double prob = binomial_probability(n, k, p);

    printf("이항 확률 P(X=%d) = %f\n", k, prob);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc ~/project/binomial_prob.c -o ~/project/binomial_prob -lm
~/project/binomial_prob

예시 출력:

시행 횟수 (n)를 입력하세요: 10
성공 확률 (p)를 입력하세요: 0.5
성공 횟수 (k)를 입력하세요: 6
이항 확률 P(X=6) = 0.205078

이항 확률 계산의 주요 구성 요소:

  1. factorial(): n! 계산
  2. combinations(): C(n,k) 또는 n 개 중 k 개를 선택하는 방법의 수 계산
  3. binomial_probability(): 전체 공식을 사용하여 P(X=k) 계산
  4. pow() 함수 (math.h 에서): 거듭제곱 계산

확률 출력

이 단계에서는 이항 확률 프로그램을 개선하여 확률 계산 결과를 더 자세하고 정형화된 형태로 출력하도록 합니다.

이전 프로그램을 수정하여 추가적인 확률 표현 방식을 포함합니다.

#include <stdio.h>
#include <math.h>

// 이전 함수 (factorial, combinations, binomial_probability) 는 동일하게 유지

int main() {
    int n, k;
    double p;

    printf("시행 횟수 (n) 를 입력하세요: ");
    scanf("%d", &n);

    printf("성공 확률 (p) 를 입력하세요: ");
    scanf("%lf", &p);

    printf("성공 횟수 (k) 를 입력하세요: ");
    scanf("%d", &k);

    double prob = binomial_probability(n, k, p);

    // 자세한 확률 출력
    printf("\n확률 계산 결과:\n");
    printf("-----------------------------\n");
    printf("시행 횟수 (n):       %d\n", n);
    printf("성공 확률 (p): %.4f\n", p);
    printf("성공 횟수 (k):    %d\n", k);

    // 다양한 확률 표현
    printf("\n확률 표현:\n");
    printf("소수점:     %f\n", prob);
    printf("퍼센트:  %.2f%%\n", prob * 100);
    printf("분수:    %.0f 분의 1\n", 1.0 / prob);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc ~/project/binomial_prob.c -o ~/project/binomial_prob -lm
~/project/binomial_prob

예시 출력:

시행 횟수 (n)를 입력하세요: 10
성공 확률 (p)를 입력하세요: 0.5
성공 횟수 (k)를 입력하세요: 6

확률 계산 결과:
-----------------------------
시행 횟수 (n):       10
성공 확률 (p): 0.5000
성공 횟수 (k):    6

확률 표현:
소수점:     0.205078
퍼센트:  20.51%
분수:    1분의 5

이 단계의 주요 개선 사항:

  1. 자세한 결과 형식 추가
  2. 여러 확률 표현 방식 표시
  3. 출력 가독성 향상

요약

이 실험에서는 이항 확률 계산을 위한 입력 값 (시행 횟수 (n), 성공 확률 (p), 성공 횟수 (k)) 을 읽는 방법을 배웠습니다. 또한, 팩토리얼, 조합, 그리고 이항 확률 공식 P(X=k) = C(n,k) _ p^k _ (1-p)^(n-k) 를 계산하는 함수를 구현했습니다. 이를 통해 각 시행에서 성공 확률이 주어졌을 때 n 번의 독립적인 시행에서 k 번의 성공을 관찰할 확률을 계산할 수 있습니다.

이 실험에서 다룬 주요 단계는 입력 값을 읽고, 공식을 사용하여 이항 확률을 계산하고, 결과 확률을 출력하는 것입니다. 이 지식은 통계, 의사 결정, 위험 분석과 같은 다양한 실제 상황에 적용될 수 있습니다.