기하 분포(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%), 그 이후로는 지수적으로 빠르게 감소함을 보여줍니다. 이러한 특성 때문에 기하 분포는 통신 패킷 재전송 횟수, 게임 내 아이템 드롭 시뮬레이션, 신뢰성 공학 등 다양한 분야에서 활용됩니다.