이 글은 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² = 20000
    • Var(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 = 70
  • E[X²] = 0.9·50² + 0.1·250² = 2250 + 6250 = 8500
  • Var(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. 공정한 주사위와 카드 한 장 뽑기가 여기 속합니다.

이항분포 — 확률변수 XB(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#