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

파이썬으로 풀어보는 생일 역설(Birthday Paradox)

생일 역설이란?

생일 역설(Birthday Paradox)은 확률론 분야에서 가장 유명한 문제 중 하나입니다. 이름처럼 직관과 크게 어긋나는 결과를 보여주기 때문에 '역설'이라 불리는데, 핵심은 생일이 같은 두 사람이 존재하려면 생각보다 훨씬 적은 인원만 필요하다는 점입니다. 실제로 단 23명만 모여도 생일이 겹칠 확률이 50%를 넘어섭니다.

문제 정의

생일 파티에 여러 명의 사람들이 모여 있을 때, 그중 생일이 같은 사람이 존재할 확률을 바탕으로 대략 몇 명의 사람이 필요한지 구하는 것이 이 문제의 목표입니다.

먼저 간단한 확률 개념부터 짚어 보겠습니다. 공정한 동전을 던졌을 때 앞면이 나올 확률은 1/2이며, 동전을 10번 던져 모두 앞면이 나올 확률은 약 1/1024, 즉 0.001 수준에 불과합니다. 이처럼 독립적인 사건이 반복될수록 원하는 결과가 나올 확률은 급격히 줄어듭니다.

핵심 개념 이해하기

윤년이 아닌 해(365일)를 기준으로, 두 사람의 생일이 서로 다를 확률은 다음과 같습니다.

$$\frac{364}{365} = \lgroup1-\frac{1}{365}\rgroup$$

첫 번째 사람은 어떤 생일이든 가질 수 있으므로 해당 확률을 '1'로 보고, 이후 사람들부터는 앞선 사람들과 생일이 다를 확률을 순서대로 곱해 나갑니다.

P(different) = $$1\times\lgroup1-\frac{1}{365}\rgroup\times\lgroup1-\frac{2}{365}\rgroup\times\lgroup1-\frac{3}{365}\rgroup\times\lgroup1-\frac{4}{365}\rgroup...$$

따라서 생일이 같은 사람이 존재할 확률은 전체 확률에서 '모두 다를 확률'을 뺀 값이 됩니다.

P(same) = 1 − P(different)

확률 70%가 되려면 몇 명이 필요할까?

예를 들어, 생일이 같은 사람이 존재할 확률이 0.70(70%)이 되기 위해 필요한 인원수 N은 다음 근사 공식으로 구할 수 있습니다.

N = √2 × 365 × log(1/(1−p))

N = √2 × 365 × log(1/(1−0.70)) ≈ 30

계산 결과, 생일이 겹치는 사람이 존재할 확률이 약 70%가 되려면 대략 30명의 인원이 필요합니다.

파이썬 코드 예제

import math

def find_people(p):
    return math.ceil(math.sqrt(2 * 365 * math.log(1 / (1 - p))))

print(find_people(0.70))

위 코드에서 math.log는 자연로그를 계산하며, math.ceil을 사용해 결과값을 올림 처리하여 필요한 최소 인원수를 정수로 반환합니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.

30

이처럼 생일 역설은 단순한 파이썬 코드 몇 줄로도 손쉽게 검증할 수 있으며, 해시 충돌(hash collision) 분석 등 컴퓨터 과학의 여러 분야에서도 응용되는 중요한 개념입니다.