게임 디자인과 랜덤성의 수학 Part 2: 확률 분포로 드랍률·가챠·천장 설계하기
이 글은 Claude Opus 4.8 을 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.
1편에서는 거시적인 관점에서 게임 속 랜덤성의 역할과 실패 사례, 그리고 통제된 무작위성의 도구 상자를 개념 수준으로 훑었습니다. 2편에서는 그 도구들의 수학적 속살 을 직접 펼쳐 봅니다. 확률 분포가 게임의 드랍률·가챠·천장 시스템을 어떻게 결정하는지, 실제 수식과 계산 예제로 분해하겠습니다.
이 글을 관통하는 단 하나의 관점을 미리 못 박아 두겠습니다. 좋은 무작위 설계란 결국 “기댓값 E[X]는 고정한 채, 분산 Var(X)을 조작하는 일” 입니다. 평균 보상은 그대로 두고 변동성만 깎는 것 — 이 한 문장이 PRD·천장·셔플백·2RN 을 모두 꿰뚫습니다.
표기 규칙: 이 글의 모든 수식은 별도 수식 렌더러 없이 백틱 코드와 유니코드 위첨자로 표기합니다. 모든 수치 예제는 직접 계산해 검증한 값입니다.
1. 기댓값·분산·표준편차 — “느낌"의 수학#
세 가지 기본기부터 짚겠습니다. 이산 확률변수 X 에 대해,
- 기댓값:
E[X] = Σ x·P(x)— 장기 평균 - 분산:
Var(X) = E[X²] − (E[X])²— 평균에서 얼마나 흩어지는가 - 표준편차:
σ = √Var(X)— 분산을 원래 단위로 되돌린 값
게임 디자인에서 결정적인 통찰은 이것입니다. 평균이 같아도 분산이 다르면 전혀 다르게 느껴진다. 평균 DPS 가 똑같이 100인 두 무기를 봅시다.
- 무기 A (안정형): 항상 100. →
E[A]=100,Var(A)=0,σ=0 - 무기 B (도박형): 50% 확률로 0, 50% 확률로 200.
E[B] = 0.5·0 + 0.5·200 = 100(평균은 동일)E[B²] = 0.5·0² + 0.5·200² = 20000Var(B) = 20000 − 100² = 10000,σ = 100
평균 DPS 는 똑같지만, B 는 표준편차가 평균과 맞먹습니다. 플레이 중 A 는 “믿음직"하고 B 는 “터지거나 망하거나(feast-or-famine)“로 느껴집니다.
좀 더 현실적인 크리티컬 예시도 보겠습니다. 평타 50, 10% 확률로 5배(=250) 크리인 무기라면,
E[X] = 0.9·50 + 0.1·250 = 45 + 25 = 70E[X²] = 0.9·50² + 0.1·250² = 2250 + 6250 = 8500Var(X) = 8500 − 70² = 3600,σ = 60
상대 변동성 σ/평균 ≈ 0.857 로 꽤 높습니다. 디자이너가 “더 일관된 데미지"를 원한다면, 평균 70은 유지한 채 크리 배율을 낮추고 크리율을 높여 분산만 줄이면 됩니다. 다시 강조하지만, 이것이 무작위 설계의 핵심 레버입니다. E[X] 는 붙들고, Var(X) 를 주무른다.
2. 균등분포·이항분포 — 그리고 “적어도 하나” 트릭#
2.1 두 기본 분포#
이산 균등분포 ({a, …, b}, 총 n = b−a+1 개): P(X=x) = 1/n, 평균 (a+b)/2, 분산 (n²−1)/12. 공정한 주사위와 카드 한 장 뽑기가 여기 속합니다.
이항분포 — 확률변수 X 가 B(n, p) 를 따를 때 (독립 시행 n 회 중 성공 횟수):
P(X=k) = C(n,k) · pᵏ · (1−p)ⁿ⁻ᵏ- 평균
E[X] = np, 분산Var(X) = np(1−p)
2.2 가챠에서 가장 쓸모 있는 한 줄: “적어도 하나”#
“n 번 뽑아서 5성을 적어도 하나 얻을 확률"은 이항분포 합으로 계산할 필요가 없습니다. 여사건이 한 줄에 끝납니다.
P(X ≥ 1) = 1 − P(X=0) = 1 − (1−p)ⁿ
예를 들어 p=0.01 로 10번 뽑으면, (0.99)¹⁰ = 0.90438… 이므로 P(≥1) = 1 − 0.90438 = 0.0956, 약 9.56% 입니다.
이 트릭이 왜 중요한지는, 원신의 기본 5성 확률 p=0.006 으로 표를 그려 보면 분명해집니다.
뽑기 수 n |
(0.994)ⁿ |
P(≥1) = 1−(0.994)ⁿ |
|---|---|---|
| 10 | 0.941594 | 5.84% |
| 50 | 0.740149 | 25.99% |
| 100 | 0.547821 | 45.22% |
| 300 | 0.164405 | 83.56% |
기본 확률만으로는 100번을 뽑아도 5성을 봤을 확률이 동전 던지기(45%)에도 못 미칩니다. 바로 이 잔인한 간극을 메우려고 천장 시스템이 존재합니다. 기본 확률만으로 굴러가는 가챠는 수학적으로 너무 가혹합니다.
3. 기하분포 — 드랍률의 심장#
“성공 확률 p 인 시도를 첫 성공까지 반복하면 몇 번 걸리는가.” 게임에서 가장 자주 등장하는 질문이고, 그 답이 기하분포(geometric distribution) 입니다. 단, 두 가지 표기법(convention)이 있으며 절대 섞으면 안 됩니다.
표기 A — “시도 횟수” X ∈ {1, 2, 3, …} (첫 성공이 나온 그 시도까지의 횟수):
P(X=k) = (1−p)ᵏ⁻¹ · p- 평균
E[X] = 1/p, 분산Var(X) = (1−p)/p²
표기 B — “첫 성공 전까지의 실패 횟수” Y ∈ {0, 1, 2, …}:
P(Y=k) = (1−p)ᵏ · p- 평균
E[Y] = (1−p)/p(즉E[X] − 1), 분산은 A 와 동일
논문·문서를 인용할 때 어느 쪽 표기인지 반드시 확인해야 합니다. 평균이 1/p 인지 (1−p)/p 인지가 달라지기 때문입니다.
3.1 드랍률 2% 아이템의 진실#
p = 0.02 인 아이템을 예로 들겠습니다(표기 A 기준).
- 평균:
E[X] = 1/0.02 = 50번 - 분산:
Var = 0.98/0.02² = 2450,σ ≈ 49.5
표준편차가 평균과 거의 같습니다. 기하분포는 극단적으로 변동성이 큰 분포입니다.
여기서 가장 중요한 함정. 평균이 50이라고 해서 “대략 50번쯤 하면 나오겠지"가 아닙니다. 중앙값(median) 을 보면,
median = ⌈ ln(0.5) / ln(1−p) ⌉ = ⌈ −0.6931 / −0.02020 ⌉ = ⌈34.31⌉ = 35
즉 절반의 사람은 35번 안에 얻지만, 평균은 50번 입니다. 평균이 중앙값보다 큰 이유는 분포의 오른쪽 꼬리가 길기 때문입니다. 이 긴 꼬리를 직접 보겠습니다.
P(X > 100) = (0.98)¹⁰⁰ = 0.1326→ 약 13.3% 가 100번을 넘김P(X > 150) = (0.98)¹⁵⁰ = 0.0483→ 약 4.8% 가 평균의 3배인 150번을 넘김
flowchart LR
A["드랍률 p = 2%"] --> B["중앙값 35회<br/>(절반은 여기서 획득)"]
A --> C["평균 50회"]
A --> D["13.3%는 100회 초과"]
A --> E["4.8%는 150회 초과<br/>(평균의 3배)"]
style A fill:#87CEEB,color:#000000
style B fill:#90EE90,color:#000000
style C fill:#FFD700,color:#000000
style D fill:#FFB6C1,color:#000000
style E fill:#FFA07A,color:#000000
기하분포의 무기억성(memorylessness) 때문에, 100번을 실패해도 다음 시도의 성공 확률은 여전히 p 그대로입니다. 분포가 당신에게 성공을 “빚지지” 않습니다(1편의 도박사의 오류를 떠올려 주십시오). 천장 시스템은 바로 이 긴 꼬리를 강제로 잘라내는 장치 입니다.
4. 음이항분포 — “k개 모으려면 몇 번?”#
기하분포가 “첫 성공까지"라면, 음이항분포(negative binomial) 는 “k번째 성공까지"를 다룹니다. 무기 강화에 같은 재료 6개가 필요하거나, 같은 캐릭터를 6번 뽑아 재능을 만개해야 할 때 쓰입니다.
시도 횟수 표기 (k 번 성공까지 걸린 시도 수 n ∈ {k, k+1, …}):
P(N=n) = C(n−1, k−1) · pᵏ · (1−p)ⁿ⁻ᵏ- 평균
E[N] = k/p, 분산Var(N) = k(1−p)/p² k = 1이면 기하분포가 됩니다(특수 경우).
위키피디아 공식이 달라 보이는 이유도 짚겠습니다. 위키피디아는 “r 번째 성공 전까지의 실패 횟수 Y“로 정의해 평균을 r(1−p)/p 로 적습니다. 이는 모순이 아니라 같은 분포를 r 만큼 평행이동 한 것입니다. 총 시도 N = Y + r 이므로 r(1−p)/p + r = r/p, 시도 횟수 표기의 평균과 정확히 일치합니다.
계산 예제 — p=0.05 로 6개 모으기: E[N] = 6/0.05 = 120 번. 분산 = 6·0.95/0.05² = 2280, σ ≈ 47.8.
5. 쿠폰 수집가 문제 — “세트 완성” 가챠의 함정#
1편에서 일본이 2012년 금지한 “컴플리트 가챠"를 다뤘습니다. 그 약탈성의 수학적 근거가 바로 쿠폰 수집가 문제(coupon collector’s problem) 입니다.
매 뽑기가 n 종류 중 하나를 균등하게 준다고 할 때, n 종류를 전부 모으는 데 필요한 평균 뽑기 수 는,
E[draws] = n · Hₙ = n · (1 + 1/2 + 1/3 + … + 1/n) ≈ n·(ln n + γ)(γ ≈ 0.5772, 오일러–마스케로니 상수)
n |
Hₙ |
정확값 E = n·Hₙ |
|---|---|---|
| 10 | 2.92897 | 29.3 회 |
| 50 | 4.49921 | 225.0 회 |
이게 왜 약탈적일까요. 기댓값이 n·ln n 으로 커지는 것도 문제지만, 더 무서운 건 마지막 몇 개가 비용의 대부분을 차지 한다는 점입니다. 마지막 한 종류를 얻는 데만 평균 n 번이 걸립니다(n·(1/1) 항). 50종 세트 완성은 평균 225번이지만 분산이 거대해서, 상당수 플레이어는 그보다 훨씬 많이 지불합니다. “세트를 완성하면 대박"이라는 구조가 위험한 이유입니다.
6. PRD(의사 난수 분포) 완전 분해#
1편에서 PRD 의 아이디어를 소개했습니다. 이제 수식을 펼치겠습니다. 마지막 성공 이후 N 번째 시도 에서의 발동 확률은,
P(N) = min(1, C · N)
연속 실패할 때마다 확률이 선형으로 올라가고, 성공하면 다시 C·1 로 리셋됩니다. 핵심은 C 가 명목 확률이 아니라는 것 입니다.
마지막 성공 이후 정확히 n 번째에 성공할 확률은,
P(성공 = n) = (C·n) · ∏ᵢ₌₁ⁿ⁻¹ (1 − C·i)
이고, 최대 시도 수는 N_max = ⌈1/C⌉ 입니다(C·N ≥ 1 이 되는 순간 성공 확정). 그러면 평균 시도 수 E[N] = Σ n·P(n) 이고, 명목 확률 p = 1/E[N] 가 됩니다. C 는 목표 p 에 대해 이 점화식을 만족하는 근이며, 닫힌 형식이 없어 수치적으로(이분법 등) 풉니다.
아래는 Liquipedia 의 명목 확률별 C 값입니다(정찰 과정에서 점화식 솔버로 독립 재현해 일치를 확인했습니다).
명목 확률 p |
C |
N_max = ⌈1/C⌉ |
E[N] = 1/p |
|---|---|---|---|
| 5% | 0.003802 | 264 | 20.00 |
| 10% | 0.014746 | 68 | 10.00 |
| 15% | 0.032221 | 32 | 6.67 |
| 20% | 0.055704 | 18 | 5.00 |
| 25% | 0.084744 | 12 | 4.00 |
| 30% | 0.118949 | 9 | 3.33 |
| 50% | 0.302103 | 4 | 2.00 |
| 75% | 0.666667 (=2/3) | 2 | 1.33 |
예컨대 “25% 강타"는 매 타격 25%가 아니라 C ≈ 8.47% 로 시작해 8.47% → 17% → 25% … 로 오르다 12타째에 확정됩니다. 화면의 “25%“는 매번의 확률이 아니라 평균값 입니다.
6.1 PRD 는 평균을 지키며 분산을 죽인다#
명목 25%에서 PRD 와 진짜 기하분포를 비교하면 PRD 의 정체가 드러납니다.
| 방식 | 평균 시도 | 분산 | σ |
|---|---|---|---|
PRD (C=0.0847) |
4.00 | 3.60 | 1.90 |
기하분포 (p=0.25) |
4.00 | 12.00 | 3.46 |
평균(4타)은 같은데 PRD 의 분산이 약 3.3배 작습니다. 게다가 PRD 는 최악의 경우를 N_max=12 로 못 박지만, 기하분포의 꼬리는 무한합니다(0.25 기하분포도 P(X>20) ≈ 0.3% 가 남습니다). 운 좋은 연속 발동도, 분통 터지는 연속 실패도 함께 잘라내는 것. 이것이 PRD 의 전부입니다.
정확성 노트: PRD 의
C상수들은 Valve 가 공개한 값이 아니라 커뮤니티가 역산(reverse-engineering)한 값입니다. Liquipedia 도 공식 문서가 아닌 커뮤니티 유도를 출처로 답니다.
7. 천장 시스템의 수학 — 소프트 천장, 하드 천장, 50/50#
원신의 캐릭터 배너를 모델로 천장의 수학을 풀어 보겠습니다. 공식 수치 는 세 개입니다.
- 기본 5성 확률: 0.6%
- 하드 천장: 90회에서 5성 확정
- 종합(소프트 천장 포함) 평균 확률: 1.6% (≈ 5성 1개당 62.5회)
그런데 이 셋만으로는 그림이 안 그려집니다. 0.6% 기본 확률로 90회 안에 종합 1.6%가 나오려면, 중간 어딘가에서 확률이 급격히 치솟아야 합니다. 그게 소프트 천장(soft pity) 입니다. 데이터마이닝으로 추정된 구간별 모델은 다음과 같습니다(공식이 아닌 커뮤니티 추정치).
- 1~73회:
p = 0.6%(평탄) - 74~89회: 한 번 뽑을 때마다 약 +6%씩 급상승 (
74회 ≈ 6.6%,75회 ≈ 12.6%, …89회 ≈ 94.6%) - 90회:
p = 100%(하드 천장)
이 모델을 직접 돌려 보면(정찰조 검증), 확률 질량의 총합이 정확히 1이 되고, 5성 1개당 평균 = 62.3회, 종합 확률 = 1/62.3 = 1.605% 로 공식 1.6%를 재현 합니다. 여기서 배울 점이 묵직합니다. 공개된 1.6%라는 숫자는 기본 확률이 아니라 소프트 천장 경사가 거의 다 만들어 낸 결과 입니다. 플레이어가 체감하는 건 0.6%지만, 실제 평균을 떠받치는 건 막판의 가파른 경사인 것이죠.
7.1 50/50 과 픽업 확정#
캐릭터 한정 배너에서 5성이 떴을 때, 50%는 픽업 캐릭터이고, 빗나가면(50% 실패) 다음 5성은 픽업 확정 입니다. 픽업 캐릭터 하나를 얻기까지 필요한 5성 개수의 기댓값은,
1·(0.5) + 2·(0.5) = 1.5개
따라서 픽업 5성 1개당 평균 뽑기 ≈ 62.3 × 1.5 ≈ 93.4회, 그리고 최악의 경우 = 2 × 90 = 180회 입니다(하드 천장 90에서 50/50 실패 → 다음 하드 천장 90에서 픽업 확정).
정확성 노트:
0.6% / 90 / 1.6%는 공식 수치입니다. 반면 “74회부터 +6%/뽑기” 경사와 “5성당 ~62회” 추정치는 데이터마이닝·시뮬레이션에서 나온 커뮤니티 값입니다. (이후 도입된 “Capturing Radiance” 메커니즘은 픽업 확률을 50%보다 약간 높게 보정하지만, 고전적 모델은 위의 깔끔한 1.5배 / 180회입니다.)
8. 변동성 감소 도구 상자, 이번엔 수식으로#
8.1 파이어 엠블렘 2RN — 두 번 굴려 평균 내기#
1RN(FE1~5)은 0~99 난수 하나를 뽑아 표시 명중률 h 와 비교합니다. P(명중) = h/100, 표시값이 곧 진짜 명중률입니다.
2RN(FE6~12)은 난수 둘 a, b 를 뽑아 평균 (a+b)/2 < h 일 때 명중합니다. 두 균등분포의 평균은 가운데(~49.5)가 뾰족한 삼각분포 를 이루므로 확률 질량이 중앙에 몰립니다. 전체 10,000쌍을 전수 계산한 진짜 명중률은 다음과 같습니다.
표시 명중 h |
1RN = h/100 |
2RN 진짜 명중 | 차이 |
|---|---|---|---|
| 1 | 0.0100 | 0.0003 | −0.0097 |
| 10 | 0.1000 | 0.0210 | −0.079 |
| 30 | 0.3000 | 0.1830 | −0.117 |
| 50 | 0.5000 | 0.5050 | +0.005 |
| 70 | 0.7000 | 0.8230 | +0.123 |
| 90 | 0.9000 | 0.9810 | +0.081 |
| 99 | 0.9900 | 0.9999 | +0.0099 |
규칙이 확인됩니다. 50 미만에서는 진짜 명중이 표시보다 낮고, 50 초과에서는 높으며, 50 근처에서 교차 합니다. 99% 표시일 때 빗나갈 확률을 비교하면,
- 1RN:
1 − 0.99 = 1/100(1%) - 2RN:
1 − 0.9999 = 1/10000(0.01%)
즉 2RN 은 “99% 공격이 빗나가는 어처구니없는 1/100 사건"을 1/10,000로 만듭니다. “99%면 거의 무조건 맞겠지"라는 플레이어의 직관에 수치를 맞춘 것입니다. 동시에 명중률이 높은 쪽은 더 보상하고 낮은 쪽은 더 가혹하게 만드는데, 보통 아군 유닛이 적보다 명중이 높으므로 결과적으로 플레이어에게 유리합니다.
8.2 셔플백 — 테트리스 7-bag 의 가뭄 상한#
7종 블록을 한 봉지에 하나씩 담아 섞어 모두 꺼낸 뒤 다시 채우면, 각 블록은 7개마다 정확히 한 번 등장합니다. 같은 블록 사이 최대 간격 은 한 블록이 어떤 봉지의 맨 앞(1번)에 나오고 다음 봉지의 맨 뒤(7번)에 나올 때입니다.
최대 간격 = 사이에 12개 (= 6 + 6), 최소 간격 = 0 (이어 붙음)
진짜 무작위(블록당 p=1/7 기하분포)는 기대 대기 7이지만 가뭄이 무한정 길어질 수 있습니다(이론상 30개 넘게 I 블록이 안 나올 수도). 7-bag 은 각 블록의 장기 빈도를 정확히 1/7 로 유지하면서 가뭄 상한만 12로 못 박습니다. 평균은 그대로, 꼬리만 제거 — PRD·천장과 똑같은 철학입니다.
8.3 가중·클램핑#
- 가중 샘플링: 결과
i에 가중치wᵢ를 주면P(i) = wᵢ / Σwⱼ. 등급별 희귀도처럼 평균과 모양을 독립적으로 조절할 수 있습니다. - 클램핑(절단): 굴림값을
[lo, hi]로 자릅니다. 꼬리를 제거해 분산은 줄지만 평균이 안쪽으로 이동 합니다. PRD·천장·셔플백과 달리 평균 보존이 아니므로, 목표 평균이 중요한 곳에서는 주의해서 써야 합니다.
마치며#
2편을 한 문장으로 요약하면 이렇습니다. 게임의 확률 시스템은 분포의 평균이 아니라 분포의 모양(특히 꼬리)으로 설계된다. 기하분포의 긴 꼬리가 분노를 낳고, 천장과 PRD 가 그 꼬리를 잘라내며, 쿠폰 수집가의 꼬리가 “세트 완성” 과금을 약탈적으로 만듭니다. 평균은 같아도 분산과 꼬리를 어떻게 다루느냐가 게임의 체감을 가릅니다.
3편에서는 무대를 확률에서 게임이론과 시뮬레이션 으로 옮깁니다. 가위바위보의 내쉬 균형이 왜 무작위화를 강제하는지, 그리고 현대 스튜디오가 수백만 판을 AI 로 시뮬레이션해 밸런스를 검증하는 de-facto 방법론을 다룹니다.
References#
- “Geometric distribution” (Wikipedia) — https://en.wikipedia.org/wiki/Geometric_distribution
- “Binomial distribution” (Wikipedia) — https://en.wikipedia.org/wiki/Binomial_distribution
- “Negative binomial distribution” (Wikipedia) — https://en.wikipedia.org/wiki/Negative_binomial_distribution
- “Coupon collector’s problem” (Wikipedia) — https://en.wikipedia.org/wiki/Coupon_collector%27s_problem
- StatLect, Probability distributions — https://www.statlect.com/probability-distributions
- Statistics by Jim, “Geometric Distribution” — https://statisticsbyjim.com/probability/geometric-distribution/
- Liquipedia, “Pseudo-random Distribution (Dota 2)” — https://liquipedia.net/dota2/Pseudo-random_Distribution
- Serenes Forest, “True Hit (Fire Emblem)” — https://serenesforest.net/general/true-hit/
- Game8, “Genshin Impact — Pity System Explained” — https://game8.co/games/Genshin-Impact/archives/305937
- Dexerto, “What is pity in Genshin Impact” — https://www.dexerto.com/genshin-impact/what-is-pity-in-genshin-impact-how-to-guarantee-a-5-star-wish-1588745/
- Tetris Wiki, “Random Generator” — https://tetris.wiki/Random_Generator