이항 분포란 무엇인가?
이항 분포(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)의 분포를 잘 보여줍니다.