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

기하 분포(Geometric Distribution)의 개념과 C++ 구현 예제

기하 분포(Geometric Distribution)는 첫 번째 성공이 발생할 때까지 필요한 시행 횟수를 모델링하는 대표적인 이산 확률 분포입니다. n = 0, 1, 2, … 과 같이 비음수 정수 값에 대해 정의되며, 각 시행은 서로 독립적이고 성공 확률 p가 매번 동일하다는 가정을 전제로 합니다.

확률 질량 함수(PMF)

기하 분포의 확률 질량 함수는 다음과 같습니다.

$$P\lgroup n\rgroup=p\lgroup1-p\rgroup^{n}$$

여기서 p는 단일 시행에서의 성공 확률을 의미하며, (1−p)^n은 처음 n번의 시행이 모두 실패할 확률을 나타냅니다. 즉, n번 연속으로 실패한 뒤 n+1번째 시행에서 처음으로 성공할 확률을 계산하는 식입니다.

분포 함수(CDF)

누적 분포 함수는 n번 이내에 적어도 한 번 성공할 확률을 의미하며, 다음과 같이 정의됩니다.

$$D\lgroup n\rgroup=\displaystyle\sum\limits_{i=0}^n P\lgroup i \rgroup=1-q^{n+1}$$

여기서 q = 1 − p 입니다. 등비급수의 합 공식을 활용하면 위 누적합이 닫힌 형태(closed form)로 간단하게 유도됩니다.

C++ 구현 예제

C++11부터 제공되는 <random> 헤더의 geometric_distribution 클래스를 사용하면 기하 분포를 따르는 난수를 손쉽게 생성할 수 있습니다. 아래 예제는 성공 확률 0.3으로 10,000회 시행하여 각 결과값의 빈도를 별(*) 개수로 시각화한 코드입니다.

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

int main(){
    const int nrolls = 10000; // 시행 횟수
    const int nstars = 100;   // 출력할 최대 별 개수
    default_random_engine generator;
    geometric_distribution<int> distribution(0.3);
    int p[10]={};
    for (int i=0; i<nrolls; ++i) {
        int number = distribution(generator);
        if (number<10)
        p[number]++;
    }
    cout << "Geometric_distribution (0.3):" << 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: *

결과 해석

출력 결과를 보면 값이 커질수록 별의 개수가 기하급수적으로 감소하는 것을 확인할 수 있습니다. 이는 기하 분포의 핵심 특성으로, 성공 확률이 p일 때 첫 시행에서 바로 성공할 확률이 가장 높고(약 30%), 그 이후로는 지수적으로 빠르게 감소함을 보여줍니다. 이러한 특성 때문에 기하 분포는 통신 패킷 재전송 횟수, 게임 내 아이템 드롭 시뮬레이션, 신뢰성 공학 등 다양한 분야에서 활용됩니다.