Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

데이터 구조에서의 이항 분포(Binomial Distribution) 개념과 C++ 구현 예제

이항 분포란 무엇인가?

이항 분포(Binomial Distribution)는 N번의 베르누이 시행(Bernoulli Trial) 중 n번의 성공을 얻을 확률을 나타내는 이산 확률 분포 Pp(n | N)입니다.

여기서 베르누이 시행은 x = 0과 x = 1이라는 두 가지 가능한 결과만을 갖는 실험을 의미합니다.

  • x = 1 : 성공(success)
  • x = 0 : 실패(failure)

성공이 일어날 확률을 p라고 하면, 실패가 일어날 확률 q는 q = 1 – p로 정의됩니다. 이러한 조건에서 이항 분포는 다음과 같은 수식으로 표현할 수 있습니다.

$$P_{p}\lgroup n\:\arrowvert\ N\rgroup=\left(\begin{array}{c}N\\ n\end{array}\right) p^{n}\lgroup1-p\rgroup^{N-n}$$

즉, N번의 독립적인 시행에서 정확히 n번 성공할 확률은 '성공 n번과 실패 N–n번이 발생하는 조합의 수'에 '각 경우의 확률'을 곱한 값으로 계산됩니다.

C++ 구현 예제

아래 예제는 C++의 <random> 헤더에 포함된 binomial_distribution 클래스를 활용하여, 시행 횟수 9회와 성공 확률 0.5를 가진 이항 분포를 10,000번 샘플링하고 그 결과를 히스토그램 형태로 출력하는 코드입니다.

#include <iostream>
#include <random>
using namespace std;
int main(){
    const int nrolls = 10000; // 시행(롤) 횟수
    const int nstars = 100;   // 배분할 별(*)의 최대 개수
    default_random_engine generator;
    binomial_distribution<int> distribution(9,0.5);
    int p[10]={};
    for (int i=0; i<nrolls; ++i) {
        int number = distribution(generator);
        p[number]++;
    }
    cout << "binomial_distribution (9,0.5):" << endl;
    for (int i=0; i<10; ++i)
        cout << i << ": " << string(p[i]*nstars/nrolls,'*') << endl;
}

실행 결과

0:
1: *
2: ******
3: ***************
4: *************************
5: ************************
6: ****************
7: *******
8: *
9:

결과 해석

출력된 히스토그램을 보면 성공 횟수가 4~5회일 때 빈도가 가장 높고, 양쪽 끝(0회 또는 9회)으로 갈수록 빈도가 급격히 줄어드는 것을 확인할 수 있습니다. 이는 성공 확률 p = 0.5인 대칭적인 이항 분포의 특징으로, 평균값(N × p = 9 × 0.5 = 4.5) 근처에 결과가 집중되는 종 모양(bell-shaped)의 분포를 잘 보여줍니다.