Eli의 여백

바쁜 나날들 사이에서 생각났던 이런저런 것들을 적어봅니다.

IT/새로운 시도

천장 찍으려면 얼마 필요? 뽑기 확률 시뮬레이터(Loot box simulator)

Eli♪ 2022. 1. 17. 00:58

뽑기 확률 계산

(초기 로딩에 약간 시간이 소요될 수 있음)

뽑기확률 by ProjectEli (@projecteli) on CodePen.

 

 

 

작성계기

얼마전에 우연하게 확률형 아이템이 있는 게임들의 확률 표기 방식에 대해 문제를 지적하는 한 영상(김실장 유튜브)을 보고 영상에 나온대로 내가 뽑을 확률이 99%가 되려면 예상 시도횟수와 들어가는 비용이 얼마나 되는지 쉽게 계산할 수 있으면 좋겠다는 생각이 들었다. 그런데 아쉬웠던 점은 우리나라 사람이 우리나라 게임에 대해서 얘기하고 있는데 일본껄 가져왔다는 것이다. 약간 검색을 해보니 우리나라에 뽑기 확률 계산기가 제대로 된 게 없어서 그런 것 같았다. 특히 천장을 찍기 위해 필요한 뽑기 시도 횟수같은걸 제대로 구하는건 우리나라 확률형 아이템 규제법안에 아주 중요한 자료가 될 수 있을 것으로 생각하고, 나도 그런 정보들이 궁금했기도 해서 누구나 쉽게 쓸 수 있는 형태로 만들어서 공유하면 좋을 것 같았다. 언제까지 다른나라 사이트에 가서 번역기 돌려가면서 할 순 없지 않은가.

 

하여간 주말 이틀동안 엄청난 시행착오와 검색과 기타등등을 거쳐서 쓸만한 프로그램으로 만들었고 이제는 내 블로그에 공개할 수 있게 되었다. 디자인은 다른 사이트 정보를 많이 참고하였다. 소스 코드도 위젯 상단의 탭들을 눌러 확인할 수 있으니 이제 게임사들이 이러한 표기방식으로 바꿀 능력이 없어서 못한다는 소리는 못할 것이다. 하여간 많은 사람들이 유용하게 사용할 수 있으면 좋겠다. 모바일에서도 잘 되는걸 목표로 했었고, 실제로 내 안드로이드 폰에서 크롬 브라우저로 접속했을 때 잘 되는 것으로 확인했다.

 

구현 원리와 어떤 점에서 구현이 어려웠는지(특히 계산 시간 단축), 그리고 참고했던 자료들에 대해서는 이 글의 후반부에서 얘기하고, 우선은 누구나 사용할 수 있게 사용 방법부터 적어보겠다.

 

사용 방법 및 결과 해석 예제

넣어야 되는 값들 설명

1뽑당 확률: 말 그대로 뽑기 1번 했을 때 나올 확률이다. 단위는 %이고, 0~100% 범위 내에서 적으면 된다.

1뽑 가격: 1번 뽑는데 드는 가격이다. 나중에 예상 비용 계산하는데 쓸 수 있다. 건들지 않아도 계산에는 지장 없다.

뽑기 시도 횟수: 내가 몇번을 뽑을지에 대해 적는다. 10연차 돌리는 사람들을 위해 10번으로 해 두었는데, 0~천만 번 사이의 값을 넣을 수 있다. (2022-05-26 기준 천만 번으로 상한 확장)

당첨 횟수 목표: 앞에 적은 뽑기 시도 횟수로 몇 번 당첨을 노리는지를 적는다. 기본은 1번 뽑을 확률이고, 여러개를 뽑을 확률이 궁금하면 숫자를 올리면 된다. 뽑기 시도 횟수보다 작아야 함에 주의한다.

 

다 적었다면 계산 버튼을 누르면 된다. 계산 시간은 확률을 0.0000x%급으로 극악으로 설정하지 않는 이상 거의 바로 표시될 것이다. 확률 기본값들을 썸네일 넣다가 발견한 메이플 위매그 소울 기준으로 바꾸고 1000번뽑기로 해보니 꽤 볼만한 결과가 나오는거같아서 변경한 채로 고정한다. 실행시간은 20ms 이내이다.

 

혹시 안되거나 오류가 있는 경우 댓글로 제보해주면(로그인 필요없음) 시간날 때 수정을 고려해 보겠다.

 

실행 결과 예시

위에 설명했듯이 기본값은 10연차를 돌리는 사람들을 위해 5%확률 10회시도 1번당첨으로 해두긴 했는데 결과가 영 밋밋해서 5%확률 100회시도 5번 당첨으로 가져와 봤다.

처음 나오는 결과로는 내가 적은 당첨 횟수 목표를 달성할 확률이 몇%나 되는지 계산해 준다. 5%짜리를 100번 뽑으면 5번 나올 확률이 절반이 약간 넘는 수준이다. 상식적으로 5%면 5번 나와야되는거 아니야? 라고 생각할 수 있지만 실제로는 5번도 못뽑을 확률이 무려 44%정도나 된다. 여기까지는 뽑기 많이 해본 사람들에게는 별로 감흥이 없는 정보이다. 다음으로 넘어가 보자.

 

다음으로 보여주는 정보는 위의 사진과 같이 0~10회까지 정확하게 당첨될 확률이 노란색 바로 표시되고, 내가 입력한 뽑기 횟수를 뽑았을 때 해당 횟수 이상 당첨될 확률은 파란색 바로 표시된다. 입력한 목표 당첨수가 10회 이하이면 초록색으로 강조해 준다. 목표 당첨수가 작은 경우에는 유용하게 활용할 수 있을 것이다.

 

해석 방법은 앞에서 입력한 5%짜리 뽑기 100번을 뽑을때 정확하게 5번 당첨될 확률이 18.002%가 된다는 얘기이다. 그리고 5번 이상(5, 6, 7, 8, ...) 당첨될 확률은 앞의 결과에서 얻었던 대로 56.4%인 것을 알 수 있다.

 

그 외에도 정확하게 3번 당첨될 확률이 13.96%, 100번을 뽑았는데 한번도 당첨이 안될 확률도 무려 0.59%나 존재한다는 사실을 알 수 있다. 0~5회 정도 당첨을 목표로 하고 있다면 0회 당첨(질렀는데 무과금?) 확률도 여기서 유심히 볼 필요가 있겠다. 1번 이상 나올 확률은 99.4%이다. 다음으로 넘어간다.

 

이제 대망의 예상 뽑기 횟수이다. 여기서는 내가 입력했던 뽑기 수가 무시되고, 앞에서 입력했던 목표 횟수가 확정적으로 나오려면 몇번이나 뽑아야되는지에 대해서 보여 준다.

 

해석은 다양하게 할 수 있지만, 다음의 시나리오를 생각해볼 수 있다. 먼저 내가 확정적(95%)으로 목표한 5번 당첨을 달성하고 싶으면 몇번 뽑아야되는지가 181번으로 계산되어 있다. 물론 이만큼 뽑더라도 5% 확률로 5번이 안나올 수가 있다. 5번이 안나오면 다른 횟수들은 얼마나 되는지 알고싶으면 앞으로 돌아가서 뽑기 시행 횟수에 181을 넣고 다시 계산하면 두 번째 표에서 각 횟수별로 확률을 정확하게 볼 수 있다.

 

또다른 시나리오로는 내가 뽑기 횟수로 100번을 입력했지만 중간점검으로 50번까지 뽑았을 때 목표한 5번 당첨이 됐다면 얼마나 운이 좋은지를 알 수 있다. 위에 표를 보면 50번 뽑았을 때 5번 당첨이 나올 확률이 10%밖에 안된다. 만약 5번 나왔다면 다수의 90%를 뒤로 하고 개이득을 본 것이다.

 

만약 5번이 안나와서 150번까지 뽑게 됐다면 내가 어디쯤에 있는지도 알 수 있다. 80%와 90% 사이에 걸쳐 있는데 원래는 그정도 확률로 5번이 나왔어야 되는 것이다. 만약 현재까지 3번이 뽑혔다면 운 없는 10~20% 안에 들어버린 것이다. 정확하게 얼마나 운이 없는지를 알고 싶으면 처음으로 돌아가서 뽑기 시도 횟수에 150을 넣고 목표 당첨 횟수에 3을 적은 다음에 바가 많이 있는 표를 보면 된다. 계산해보니 3번 이상 뽑을 확률이 무려 98.185%로, 나보다 못뽑을 확률이 2%도 안되는 수치이다. 또한 150번 뽑았는데 5번 이상이 당첨됐어야 할 확률도 해당 표에서 87.44%로 읽을 수 있다. 즉 앞에서 예상했던 10~20%의 운없는 사람 중 정확하게는 약 12.5%에 속하는 것을 알 수 있다. (나는 12.5%인데 나보다 못뽑을 확률은 왜 2%지? 라고 생각할 수 있는데 뽑는건 0.5번 뽑기가 안되기 때문에 확률도 불연속적이라고 생각하면 된다. 즉 나랑 똑같이 3번뽑을 확률이 10퍼고 나보다 못뽑을 확률이 2퍼인 것. 계산에 이러한 점들이 모두 반영되어 있다.)

 

그리고 만약 1뽑당 가격을 맞게 적었다면 이 표에서 원하는 확률로 목표달성하기 위한 예상 비용도 같이 볼 수 있다. 기본 단위는 모바일게임들에서 많이 나오는 다이아인데, 뭐 재량껏 알아서 잘 해석하면 된다. 입력값에 돈 단위 프리셋도 몇가지 해뒀는데 게임별로 단위가 다 달라서 해석하는 사람 마음이다.

 

마지막으로 이 계산을 하기 위해 걸린 시간이 ms단위로 표시된다. 사실 이걸 줄이기 위해서 엄청나게 시행착오를 겪었는데 결국에는 일본 사이트 계산기 수준으로 매우 빠르게 개선하는 데에 성공했다. 앞에서도 설명했듯이 기본적으로는당첨 확률이 0.05% 이하로 낮으면 오래 걸릴 수 있으며, 뽑기 횟수를 엄청나게 늘리거나(최대 5만 회까지) 당첨 횟수를 많이 키우면 시간이 오래 걸리는 경우도 발생할 수 있다. 외부 서버가 아니라 자기 기기로 계산하는 코드라서 기기 연산능력에 따라 속도에 차이가 날 수 있다. 대부분의 경우 0.5초 이내에 계산이 끝나고, 운이 없는 경우라도 30초 이내에 계산이 끝날 것이다.

 

파악 중인 버그

입력창에 커서가 안나옴

많이 눌러보다 보니 가끔 입력창에 커서가 안나오는 경우가 있다. 무시하고 해도 입력은 된다. 근데 커서가 안보여서 불편할 경우 그냥 새로고침 한번 하고 입력값을 다시 입력하고 실행하면 대부분의 경우 오류가 없어질 것이다.

 

계산버튼이나 입력창이 비활성화됨(굳음)

이건 계산 버튼 연타로 눌려서 쓸데없이 계산자원 낭비하거나 버그 생기는것을 막기 위해 내가 의도적으로 계산결과 나올때까지 버튼이 안눌리게 막아둔 것이다. 근데 가끔 계산결과가 나왔는데도 이게 안풀리는 경우가 있다. 이 경우에도 새로고침을 하면 문제가 없어진다.

 

아예 멈춰버리거나 흰화면이 나오거나 함

혹시 큰 숫자를 넣었다면 계산하는데 오래걸려서 화면이 굳어있는 경우가 있다. 30초까지 기다려보고 안되면 새로고침해 보자. 그리고 가끔 이전에 큰 숫자로 계산했던게 새로고침 하고도 돌면서 렉을 유발하는 경우가 있는데 이게 내가 채택한 Codepen에서 백그라운드로 계산을 돌리고 있기 때문인 것으로 추정했다. 아예 창을 껐다가 다시 켜면 리셋되면서 문제가 사라진다.

 

마이너스나 NaN같은 이상한 숫자가 나옴

입력값이 이상한 경우 이렇게 될 수 있다. 내가 수동으로 체크해서 이상한 입력값의 가능한 몇 가지를 차단해놓기는 했는데, 혹시나 못막은 경우도 있을 수 있다. 혹시 제대로 된 입력을 넣었는데도 NaN으로 나오는 경우 확률이 너무 작아서 예상 시도횟수가 2,147,483,647회(2^31-1)를 넘거나 하는 경우일 수 있다(2022-05-26기준 상한이 100만회에서 2^31-1로 변경됨). 계산은 시간 효율성을 위해 해당 횟수 뽑는 것을 상한으로 했다. 혹시 극악의 확률 템을 파밍하기 위해서 이것을 사용하는 경우 참고 바란다. 혹시 직접 제대로 계산해 보고 싶은 경우 공개된 소스코드(시뮬창 왼쪽위에 탭들 눌러보면 나옴)를 참고해서 만들어봐도 된다. 민원이 많으면 신기능으로 도입할지도?

그외에도 자질구레한 자바스크립트 오류 등에 의해 이런 현상이 나올 수 있다. 아니면 내가 잘못짰을지도... 제보해주면 감사하겠다.

 

일단 버그들은 이정도로 파악하고 있는데, 대부분 새로고침하거나 창 껐다 켜면 리셋되면서 오류가 없어진다. 입력도 최대 4개만 하면 되는 간단한 시뮬이고 계산시간도 보통은 길지 않으니 부담 없이 새로고침하면 된다.

 

다른 사이트 대비 장점

  1. PC나 모바일 등 웹브라우저만 있다면 어디서든 실행할 수 있다.
  2. 실행시간이 짧아서 결과를 즉각적으로 볼 수 있다. (보통 계산시간 수십 밀리초 미만, 모바일에서 수백 밀리초 내외, 내 컴에서 0.0004% 천만번뽑도 4밀리초 미만 나옴)
  3. 특정 서버로 정보를 보내지 않는다.
  4. 목표 달성확률 95%와 98%에 대한 정보도 제공한다. (일본 사이트에는 없음) -- 2022-05-26, 98% 수정내용 반영
  5. html 임베드 코드로 다른곳에 넣을 수도 있다.
  6. 클라이언트에서만 도는 코드이고, 소스코드를 공개 중이라 누구나 코드를 열어서 계산 원리를 확인해볼 수 있다. 
  7. 100% 자바스크립트로만 작성되어 있어 다른 JS 활용 앱으로도 포팅이 쉽다. (다만 코드의 일부를 변경하거나 일부만 떼어서 쓰거나, 상업 이용하고자 하는 경우에는 본인의 허락을 득하고 사용하면 좋겠다.)
  8. 본인은 이런걸로 수익 창출하지 않는다. 누구나 쓸 수 있게 무료 배포한다.

 

뭐 이런거 돌리는 정보도 모으다 보면 뭔가 보일지도 모르겠지만, 원래 내 의도는 많은 사람들이 자유롭게 사용하는 것을 원했기 때문에 소스코드도 공개 중이고, 정보 수집도 일체 하지 않는다. 시뮬 사용도 있는 그대로라면 비상업적인 목적으로는 자유롭게 쓸 수 있다.

 

그리고 내가 봤던 사이트 두 개(일본, 한국)에서는 둘 다 자기네 서버로 입력값을 보내게 되어있고, 와후리 사이트의 경우 결과값을 캐싱하는거같은 정황도 파악했다. 물론 알고리즘이 안좋아서 실행속도가 느리기 때문에 캐싱하면 속도가 빨라지는 장점도 있겠지만 왠지 내가 뭘 돌리고있는지에 대한 정보가 넘어가는듯한 느낌을 지울 수가 없다. 반면 내가 만든 코드는 그런 거 없다. 나에게는 아무런 정보도 오지 않고, CodePen으로도 넘어가지 않는 것으로 파악하고 있다. 그러니 눈치 안보고 사용해도 된다.

 

후기

쓰다보니 글이 길어져서 여기서 끊어야 될 것 같다. 이 글은 시뮬을 사용하려는 사람들을 위해 남겨 두고, 구현 원리나 비하인드 스토리 등에 대한 것은 다음 글에서 다루겠다. 모쪼록 유용하게 잘 사용하기 바란다. 

 

소스코드는 Github에도 올려 두었다. 개선하고 싶은 사람은 github에 커밋 요청 넣어주면 된다. 라이센스는 GNU GPL이니 주의 바란다..

 

참고로 나는 가챠라는 일본식 표현을 별로 좋아하지 않고, 랜덤박스라는 영어보다는 뽑기라는 우리말을 더 선호한다. 영어로 써둔 것은 어디까지나 외국인들에게 부르기 편하라고 해놓은 것이다. (외국인들에게 뽑기 발음 시켜보면 ㅋㅋ...) 그럼 진짜 끝.

 

------- 2022-01-26 추가

후속 글이 다음과 같이 완성되었다. 구현 원리에 대한 내용을 포함하고 있으니 궁금한 사람은 눌러서 확인해보기 바란다.

https://projecteli.tistory.com/200

 

뽑기 확률 시뮬레이터, 설계부터 구현까지

들어가며 우리나라에도 제대로 된 온라인 뽑기 확률 계산기가 있으면 좋겠다는 생각에서 출발했었고, 주말을 투자해서 쓸만한 결과물을 얻었었다. 그리고 뽑기 확률 시뮬레이터 완성품에 대한

projecteli.tistory.com

-------------------------