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

데이터 구조에서의 음의 이항 분포(Negative Binomial Distribution) 완벽 정리

음의 이항 분포란 무엇인가?

음의 이항 분포(Negative Binomial Distribution)는 음의 이항 이산 분포를 따르는 정수형 난수를 생성하는 확률 분포입니다. 이 분포는 파스칼 분포(Pascal's Distribution)라고도 알려져 있으며, 'k번의 성공이 발생하기 전까지의 실패 횟수'를 모델링하는 데 사용됩니다.

음의 이항 분포는 다음과 같은 수식으로 표현할 수 있습니다.

$$P\lgroup i\arrowvert k,p\rgroup=\lgroup \frac{k+i-1}{i}\rgroup p^{k}\lgroup 1-p\rgroup^{i}$$

수식의 구성 요소

  • k: 목표로 하는 성공 횟수
  • p: 각 시행에서 성공할 확률
  • i: k번째 성공이 일어나기 전까지 발생한 실패 횟수

즉, 이 분포는 성공 확률이 p인 독립적인 베르누이 시행을 반복할 때, k번째 성공이 나오기까지 몇 번의 실패가 발생하는지를 확률적으로 나타냅니다.

C++ 예제 코드

다음은 C++의 <random> 헤더에 포함된 negative_binomial_distribution 클래스를 활용한 예제입니다. 총 10,000회의 시행을 수행하고, 각 결과값(0~9)의 빈도를 별표(*) 개수로 시각화하여 분포의 형태를 확인합니다.

#include <iostream>
#include <random>
using namespace std;

int main(){
    const int nrolls = 10000; // 전체 시행(롤) 횟수
    const int nstars = 100;   // 배분할 별(*)의 최대 개수

    default_random_engine generator;
    negative_binomial_distribution<int> distribution(3,0.5);

    int p[10]={};

    for (int i=0; i<nrolls; ++i) {
        int number = distribution(generator);
        if (number<10)
            p[number]++;
    }

    cout << "negative_binomial_distribution (3,0.5):" << endl;
    for (int i=0; i<10; ++i)
        cout << i << ": " << string(p[i]*nstars/nrolls,'*') << endl;
}

코드 설명

  • negative_binomial_distribution<int> distribution(3, 0.5): 성공 횟수(k)를 3으로, 성공 확률(p)을 0.5로 설정한 음의 이항 분포 객체를 생성합니다.
  • 난수 엔진 default_random_engine을 사용해 10,000번의 표본을 추출합니다.
  • 결과값이 10 미만인 경우만 배열 p에 카운트하여, 값별 빈도를 집계합니다.
  • 마지막으로 각 값의 빈도에 비례하는 별표 문자열을 출력해 히스토그램 형태로 보여줍니다.

실행 결과

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

결과 해석

출력 결과를 보면 값이 커질수록 빈도가 점차 감소하는 것을 확인할 수 있습니다. 이는 음의 이항 분포의 전형적인 특징으로, 성공 확률이 0.5이고 성공 횟수가 3일 때 실패 횟수가 적은 경우가 상대적으로 더 자주 발생함을 의미합니다.

이러한 음의 이항 분포는 주사위 시뮬레이션, 대기 행렬 분석, 통계적 모델링 등 다양한 분야에서 활용되며, 특히 포아송 분포보다 분산이 큰 데이터를 모델링할 때 유용하게 사용됩니다.