Post

계속 같은 맵만 나와요: 시뮬레이션으로 확률 검증하기

게임 개발 단계에서 시뮬레이션과 실제 데이터를 비교하여 확률을 검증한 사례를 소개합니다.

계속 같은 맵만 나와요: 시뮬레이션으로 확률 검증하기

현재 2개 맵으로 플레이 테스트를 진행하고 있다. 같은 맵이 연속으로 나오는 경우가 많아 확률에 문제가 있는 게 아니냐는 의견이 있었다. 시뮬레이션과 실제 데이터를 비교하여 확률을 검증했다.

개요

우리 게임 개발팀은 플레이테스트를 매일 진행한다. 작업한 것을 검증하고 새로 작업할 일감을 찾는 방식으로 굉장히 애자일한 방식으로 개발하고 있다.

레벨이 현재 2개 만들어져있는데 같은 맵이 연속으로 나오는 경우를 자주 경험한다. 서버쪽 랜덤에 문제가 있는게 아닌가? 하는 의견이 나왔다.

마침 최근에 조직 내 테스트가 있었어서 개인의 매칭 경험을 데이터로 확인하고 시뮬레이션과 비교하여 확률을 검증해보게 되었다.

모델링

A, B 2개 맵이 있을 때 각 맵이 나올 확률이 동일하다면, 기대하는 이상적인 상황은 ABABAB 순서로 번갈아 나오는 것이다. 하지만 그것이야말로 정말 드문 일이라는 것은 모두가 알고 있다. 그러면 어느 정도 맵이 번갈아 나오면 정상 상황이라고 볼 수 있을까?

교대 비율

만약 11게임을 한다면 맵은 최대 10번 바뀔 수 있다. 맵이 바뀐 횟수를 최대 바뀔 수 있는 횟수로 나눈 것을 교대 비율이라고 하자. 교대 비율은 0과 1 사이에 있게 된다. 10번 모두 바뀌면 10/10=1이 될 것이고, 11게임 모두 같은 맵이 나왔다면 0/10=0이 될 것이다.

참고) 교대 비율alternation ratio은 행동 연구에서 공간 작업 기억을 평가하는데 사용하는 지표이다. 피험자가 연속적으로 다른 선택지를 선택하는 경향을 측정하는 비율이다.

시뮬레이션

1만명의 플레이어가 각자 11게임을 했을 때 개개인이 경험하는 교대비율의 분포를 만들어보자. 수학적으로 생각하기 어려우므로 시뮬레이션을 돌리자.

먼저 교대비를 계산하는 함수를 만든다.

1
2
3
4
5
6
def alternation_ratio(sequence):
    n = len(sequence)
    alternations = sum(1 for i in range(1, n) if sequence[i] != sequence[i-1])
    max_alternations = n - 1
    ratio = alternations / max_alternations
    return alternations, ratio

그 다음 1만명의 유저가 A, B 2개 맵을 랜덤으로 11판 했을 때 교대비의 분포가 어떻게 되는지 시뮬레이션하고 시각화한다.

1
2
3
4
5
6
7
8
9
alternation_ratios2 = []
map2 = ['A', 'B']

for i in range(10000):
    sequence = [random.choice(map2) for _ in range(11)]
    _, ratio = alternation_ratio(sequence)
    alternation_ratios2.append(ratio)

sns.histplot(alternation_ratios2, stat='percent', bins=[x / 9 for x in range(10)])

시뮬레이션 교대비 분포

0.5를 기준으로 좌우대칭이 되는 분포가 되는 것을 볼 수 있다. 교대비가 0.5라는 것은 전체 게임의 절반 정도는 동일한 맵을 연속으로 한다는 것이다.

교대 비율이 같더라도 유저의 경험은 크게 차이날 수 있다. 같은 0.5라도 AABBAABBAAB의 경우는 괜찮지만 AAAAAABABAB 순서로 나오는 것은 좋지 않다.

실제 데이터와 비교

이제 서버의 랜덤이 정상인지 확인해보자. 최근에 있었던 80명 규모의 테스트에서 각 유저의 교대비 분포가 시뮬레이션의 분포와 일치하는지 보면 된다.

게임 초기 개발 단계이므로 데이터 파이프라인은 없다. 데디 서버에 남아있는 로그들을 수집하고 로그를 파싱하여 pandas dataframe 으로 가공하기까지의 과정이 전체 작업에서 대부분의 시간을 차지했다.

결과적으로 약간 왼쪽으로 치우쳐있긴 하지만, 시뮬레이션 상의 분포와 대체로 일치함을 확인할 수 있었다.

시뮬레이션-실제 분포 비교

문제 해결

이 문제를 해결하는 것은 두 가지 선택지가 있다.

  1. 맵을 더 만든다.
  2. 개인 단위로 랜덤 보정을 해준다.

맵을 더 만들면 얼마나 개선되나?

맵을 더 만들면 이 문제가 해결되는 것은 자명하다. 그럼 맵이 몇 개쯤 되어야 동일한 맵이 반복해서 나오는 느낌이 안 들게 될까?

아래는 맵이 2, 3, 4개일 때 교대 비율 분포 시뮬레이션 결과이다. 맵 개수가 늘어날 수록 점점 오른쪽으로 치우친다. 4개 정도만 되어도 상당히 개선되는 것을 기대할 수 있다.

맵 개수가 2, 3, 4개일 때 교대 비율 분포

결론: 아무것도 하지 않는다

아무것도 하지 않기로 결정했다. 현재 확률에 문제가 없음을 확인했고, 개인 단위로 확률을 보정하는 것은 잘못될 가능성이 높으며, 새로운 맵을 추가하는 것은 앞으로 자명하게 할 일이기 때문이다.

This post is licensed under CC BY 4.0 by the author.