세상만사 관심/기술

게임 확률 구현 완벽 가이드: RNG·가챠 확률·피티·검증까지

내가그리는인생 2025. 8. 10. 19:23
반응형

게임 확률 구현과 가챠 확률 설계, RNG/PRNG, 피티 시스템, 검증·윤리, 코드 예제까지 실무 관점에서 정리했습니다.

게임에 사용되는 확률 구현: RNG(난수 발생기)부터 피티 시스템까지 완벽 가이드


1) 왜 ‘게임 확률 구현’이 품질을 좌우할까?

게임에서 확률은 전투의 치명타, 가챠(뽑기), 아이템 드롭, AI 의사결정, 맵 생성 등 거의 모든 시스템의 밑바탕이 됩니다. 동일한 숫자 1%라도 구현 방식(난수 품질, 분포 선택, 샘플링 전략, 보정 로직)에 따라 체감 확률과 유저 감정은 크게 달라집니다. 이 글은 게임 확률 구현: RNG(난수 발생기)/PRNG(의사난수 발생기) 기본기 → 분포와 샘플링 → 가챠 확률·드롭률 설계 → 보정(피티/천장) → 검증·테스트 → 윤리·규제까지 실무 관점에서 총정리합니다.


2) 핵심 개념 정리

2.1 RNG(난수 발생기) vs PRNG(의사난수 발생기)

  • RNG(Random Number Generator, 난수 발생기): 진짜 무작위(물리적 잡음 등). 게임 실무에서는 비용·접근성 때문에 드뭅니다.
  • PRNG(Pseudo-RNG, 의사난수 발생기): 수학적 알고리즘으로 의사난수 생성. 대부분의 게임 엔진과 라이브러리가 PRNG를 제공합니다.

2.2 시드(Seed, 시드값)

  • PRNG는 시드가 같으면 동일한 난수열을 재현합니다(재현성 확보).
  • 온라인 게임에서 서버 시드클라이언트 시드를 분리하고, 결과 검증을 위해 서버 권위(Server Authority) 구조를 권장합니다.

2.3 분포(Distribution, 확률분포)

  • 균등분포(Uniform): 모든 값이 동일 확률. 기본 드롭, 단순 가챠에 흔히 사용.
  • 이항·베르누이(Bernoulli/Binomial): 성공/실패 사건 모델링.
  • 정규분포(Normal): 능력치 롤링, 데미지 변동의 자연스러운 퍼짐 구현.
  • 지수·포아송(Exponential/Poisson): 희귀 이벤트 간 간격, 스폰 주기 모델링.
  • 기하분포(Geometric): ‘처음 성공까지 시도 횟수’ 같은 상황.

2.4 독립 시행 vs 비독립 시행

  • 독립 시행: 매 시도 확률이 동일(예: 가챠 매번 1%).
  • 비독립 시행: 누적 보정(피티, 확률 증가형, 보장형 드롭) 등으로 시도 간 상관관계 발생.

3) 엔진별 게임 확률 구현 베스트 프랙티스

3.1 유니티(Unity, C#)

// 균등분포 정수 추출 (상한 미포함)
int idx = UnityEngine.Random.Range(0, pool.Count);

// 균등분포 실수 추출 [0,1)
float r = UnityEngine.Random.value;

// 가중치 추첨 (누적합 방식)
int WeightedPick(List<float> weights) {
    float sum = 0f; foreach (var w in weights) sum += w;
    float t = UnityEngine.Random.value * sum;
    float acc = 0f; for (int i=0;i<weights.Count;i++){ acc += weights[i]; if (t <= acc) return i; }
    return weights.Count-1;
}

3.2 언리얼(Unreal, C++)

// 0.0~1.0 균등 난수
float r = FMath::FRand();

// 범위 난수 (0~99 포함)
int32 v = FMath::RandRange(0, 99);

3.3 서버(예: Node.js)

// 가중치 추첨 - 보안 목적이면 crypto 모듈 사용 권장
function weightedPick(weights){
  const sum = weights.reduce((a,b)=>a+b,0);
  let t = Math.random()*sum;
  for (let i=0;i<weights.length;i++){ t -= weights[i]; if (t<=0) return i; }
  return weights.length-1;
}

팁: 보안이 중요한 PvP 보상·경제 요소는 서버 측 결정 + 로그 감사 + 시드 로테이션을 기본으로.


SMALL

4) 드롭률과 가챠 확률의 수학: 기대값·분산·천장 설계

4.1 누적 확률 계산법

  • 각 시도 확률 p, n회 도전 시 최소 1회 성공 확률:
  • 목표 확률 α에 도달하려면 필요한 시도 횟수:
  • 예시: p=0.02(2%), α=0.9(90%)일 때 약 114회 시도로 90% 확률에 도달.

4.2 기대값과 비용 계산

  • 기대 시도 횟수 = , 기대 비용 = C/p (C = 1회 시도 비용)
  • 예시: p=0.05, C=300원 → 평균 20회(6,000원) 소요.

4.3 피티(천장) 설계

  • 고정 천장: N회 내 1회 보장. 예: 100회 가챠 시 반드시 1회 희귀 아이템 지급.
  • 소프트 피티: 시도 횟수에 따라 확률 점증, 당첨 시 초기화. 예: 50회 이후 매 시도마다 확률 +2%.
  • 장점: 과도한 실패로 인한 유저 이탈 방지, 단점: 고급 보상의 희소성 감소.

소프트 피티와 고정 피티 확률 변화를 비교한 꺾은선 그래프.

4.4 가중치 추첨과 테이블 설계

  • 등급별 확률 합계는 반드시 1.0 유지.
  • 픽업 구조: 상위 등급 내 일부 아이템에 가중치 부여. 예: S등급 5% 중 특정 캐릭터에 50% 할당.
  • 테스트: 100만 회 시뮬레이션으로 기대 분포와 실제 결과 비교.

5) 난수 품질과 체감 확률

  • 인간은 무작위에서도 패턴을 찾으려 함 → 연속 실패에 민감.
  • 셔플백(Shuffle Bag) 기법: 정해진 구성의 성공/실패 카드를 섞어 순서대로 배분, 허탕 꼬리 줄이기.
bag = [1]*2 + [0]*8
random.shuffle(bag)
  • 장점: 실제 확률 유지하면서 심리적 만족도 상승.

셔플백 알고리즘의 흐름과 장점 시각화.


6) 치명타, 상태이상, 드롭 테이블 설계

  • 치명타: 일정 확률로 피해량 2배. 역보정 적용 시 연속 미발생 확률 감소.
  • 상태이상: 적 저항 수치 기반 확률 계산. 예: 빙결 저항 30% → 기본 확률 50% × (1-0.3) = 35%.
  • 드롭 테이블: 레벨·티어별 테이블 교체, 희귀 아이템 슬롯 명문화.
  • 사례: 보스 처치 시 메인 슬롯(희귀), 보조 슬롯(소모품) 각각 독립 확률 적용.

7) 검증과 테스트

  • 몬테카를로 시뮬레이션: 동일 확률 구조를 수십만~수백만 회 반복 실행해 경험적 확률과 이론치 비교.
  • 카이제곱 검정: 관측 빈도와 기대 빈도의 차이를 통계적으로 검증.
  • AB 테스트: 서로 다른 확률·보정 구조를 실제 유저 집단에 적용, 잔존율·과금률 분석.
  • 로그 분석: 실제 서비스 환경에서 시도·성공 데이터 수집, 설계 대비 편차 모니터링.

8) 윤리와 규제

  • 확률 공개 의무화.
  • 미성년자 보호 장치.
  • 로그·버전 관리로 감사 대비.
  • 사회적 이슈: 일부 게임사는 과거 확률 조작, 미공개 보정 로직, 픽업 확률 왜곡 등의 문제로 사회적 논란을 일으켰습니다. 이는 이용자 신뢰를 심각하게 훼손하고, 규제 강화 및 집단 소송으로 이어진 사례도 있습니다. 확률형 아이템과 관련된 부정행위는 단기 수익을 올릴 수 있으나, 장기적으로 브랜드 이미지와 매출 모두에 치명적인 손실을 초래합니다.
  • 투명성 강화 필요성: 서버 로그 외부 감사, 확률 산출 공식 공개, 시뮬레이션 검증 결과 공개 등 투명성을 확보하는 것이 필수입니다.
반응형