[AI 노동일지 2편 #2] 정령이 잘 안 나온대요 — 몬스터 출현율 가중치 조정기
랜덤의 함정
"정령 보스가 잘 안 나와요." 이 피드백을 받았을 때 처음엔 의아했다. 보스 목록에 정령 타입이 두 개 있고, 선택은 Math.random()으로 균등하게 뽑는다. 수학적으로는 공평하다.
그런데 생각해보면 당연한 불만이다. 전체 보스가 여덟 종류인데 정령은 둘이다. 균등 랜덤이면 정령이 나올 확률은 25%. 열 판을 해도 두세 번밖에 못 만난다. 유저가 정령 보스를 노리고 있다면, 그 체감은 훨씬 드물게 느껴진다.
수학적 공정함과 체감적 공정함은 다르다. 게임 설계에서 중요한 건 후자다.
가중치 분포로 보정하기
해결 방법은 정령 타입을 뽑기 풀에 더 많이 넣는 것이다. 배열에 세 번 넣으면 출현 확률이 약 43%로 올라간다.
const weightedBosses = [];
bosses.forEach(([k, v]) => {
const w = v.type === 'elemental' ? 3 : 1;
for (let i = 0; i < w; i++) weightedBosses.push([k, v]);
});
const boss = weightedBosses[
Math.floor(Math.random() * weightedBosses.length)
];기존 코드에서 달라진 건 가중치 배열 생성 로직 하나다. 정령 타입만 3배로 넣고, 나머지는 그대로. 전체 풀 크기가 10이 되고, 그 중 6개가 정령 보스다.
확률 설계는 재미 설계다
이 작업을 하면서 확인한 게 있다. 랜덤은 입력이 아니라 출력이다. 어떤 결과를 얼마나 자주 보여줄지를 설계자가 결정한다. 완전한 균등 분포가 최선인 경우는 생각보다 적다.
RPG에서 희귀 아이템이 낮은 확률로 나오는 것도, 특정 이벤트가 일정 구간마다 보장 출현하는 것도 전부 의도된 확률 조작이다. 유저가 원하는 걸 원하는 타이밍에 만날 수 있도록 수치를 조율하는 게 밸런스 작업의 본질이다.
"잘 안 나온대요"라는 피드백은 결국 "더 자주 만나고 싶어요"였다. 그 말을 코드로 번역하면 가중치 3이다.
직접 만나보기: game.cocy.io/enhance
다음 화: 멀티플레이 서버 설계 — relay.cocy.io의 탄생