Mini Kraken의 주사위 굴림은 공정할까? 주사위 엔진 속을 들여다보다
어느 테이블이든 언젠가는 묻습니다. 이거 조작된 거 아니야? Mini Kraken이 숫자를 어떻게 고르는지, 왜 공정한지, 어떻게 직접 확인할 수 있는지, 그리고 무대 뒤에서 우리가 결코 하지 않는 일까지 — 전문 용어 없이 솔직하게 안내합니다.
Mini Kraken의 주사위 굴림은 공정할까? 주사위 엔진 속을 들여다보다
언젠가는 테이블의 누군가가 소리 내어 말합니다. "저게 무작위일 리가 없어. 이건 날 싫어한다니까." 디지털 주사위는 진짜 나무 탁자 위를 요란하게 굴러갈 수 없으니, 불운이 연달아 닥치면 앱이 저울에 슬쩍 손을 얹은 게 아닐까 의심하게 되는 것도 자연스럽습니다.
정당한 의문입니다. 솔직한 답을 들을 자격이 있으니, 먼저 분명히 밝히겠습니다. Mini Kraken의 주사위는 공정합니다. 모든 면이 똑같은 확률을 가지고, 어느 쪽으로도 슬쩍 밀지 않으며, 그리고 — 흔치 않게도 — 굴림을 직접 검증해 볼 수도 있습니다. 이 글은 그게 정확히 어떻게 돌아가는지 쉬운 말로 짚어 드립니다. 다음에 이 이야기가 나올 때 가리켜 보일 구체적인 근거를 갖추실 수 있도록요.
'공정하다'는 게 정확히 무슨 뜻일까
우리 엔진 이야기를 하기 전에, 애초에 공정한 주사위란 무엇인지부터 못 박아 두면 도움이 됩니다.
공정한 d20은 한 가지를 뜻합니다. 스무 개의 면이 모두 똑같은 확률로 나온다는 것 — 매 굴림마다 깔끔하게 20분의 1의 확률이죠. "대충 고르게"가 아닙니다. "평균적으로는 고르되 하우스 쪽에 살짝 유리하게 양념을 친" 것도 아니고요. 정확히 고릅니다. 공정한 d6은 각 면에 6분의 1의 확률을, 공정한 d100은 100분의 1의 확률을 줍니다. 이게 정의의 전부입니다.
공정함이 약속하지 않는 것에도 주목하세요. 스무 번을 굴리면 스무 개의 숫자를 모두 보게 되리라고 약속하지 않습니다. 불운의 연속이 곧 "균형을 되찾으리라"고 약속하지도 않고요. 결과가 고르게 느껴지리라고도 약속하지 않습니다. 공정함이란 오직 매 굴림의 확률에 관한 이야기일 뿐이며 — 그 점에 있어서는 우리는 타협하지 않습니다.
뚜껑을 열어 본 엔진
Mini Kraken은 주사위를 굴리는 데 자체적으로 만든 편법을 쓰지 않습니다. 모든 굴림은 — 웹사이트에서든, 캐릭터 시트에서든, 가상 테이블탑에서든, Fortuna Discord 봇을 통해서든 — 똑같이 공유되는 하나의 주사위 엔진을 거칩니다. 오랜 세월 테이블탑 플레이어들의 주사위를 굴려 온, 잘 다져진 오픈소스 주사위 라이브러리 위에 지어진 엔진이죠.
이게 두 가지 이유에서 중요합니다. 첫째, 오픈소스라는 토대는 그 수학이 알 수 없는 블랙박스가 아니라는 뜻입니다. 누구든 읽고, 시험하고, 뜯어볼 수 있는 코드니까요. 둘째, 우리가 섬세한 무언가를 굳이 새로 발명하지 않는다는 뜻이기도 합니다. 무작위성은 어설프게 영리한 자체 제작이 미묘한 편향을 끌어들이기 쉬운 영역이고, 검증을 거친 라이브러리는 바로 그 누구도 그럴 필요가 없도록 존재합니다.
정말 중요한 대목은, 이 엔진이 숫자가 필요할 때 무엇을 하느냐입니다.
숫자는 어떻게 뽑히는가 — 그리고 왜 숨은 편향이 없는가
대부분의 사람이 좀처럼 들어보지 못하는 대목이자, "이거 공정한 거 맞아?"라는 물음의 진짜 핵심이 여기 있습니다.
주사위 굴림을 흉내 내는 가장 단순한 방법은 무작위 값 하나를 가져다가 나머지 연산으로 크기를 잘라 맞추는 것입니다 — 프로그래밍에서 "나누고 나머지를 취하는" 것에 해당하죠. 빠르고, 거의 공정합니다. 하지만 여기엔 모듈로 편향이라는 유명한 결함이 있습니다. 출발점이 되는 범위가 주사위 면의 개수로 딱 나누어떨어지는 경우가 드물기 때문에, 몇몇 면이 다른 면보다 아주 살짝 더 자주 나오게 되는 것이죠. d20 하나만 놓고 보면 그 치우침은 미미하지만, 분명히 실재하고, 바로 "조작됐다"는 비난이 들러붙게 만드는 그 보이지 않는 손장난이 맞습니다.
우리 엔진은 그 편법을 거부합니다. 어정쩡한 숫자를 억지로 끼워 맞추는 대신, 흔히 기각 표본추출(rejection sampling)이라 불리는 기법을 씁니다. 쉽게 말하면 이렇습니다. 원본 무작위 값이 확률을 치우치게 만들 그 자투리 조각에 떨어지면, 엔진은 그 값을 버리고 조용히 다시 뽑습니다. 주사위 면 위에 완벽하게 고르게 대응되는 값만 남기는 것이죠. 그 결과는 편향이 전혀 없는 분포입니다 — 모든 면이 정확하고 정직한 자기 확률대로 떨어집니다. 이따금 일어나는 재추첨을 여러분이 알아챌 일은 없습니다. 1밀리초의 몇 분의 일 만에 벌어지니까요. 하지만 그 덕분에 Mini Kraken의 d20은 수학이 허락하는 한 가장 고르게 나옵니다.
이것이 이 모든 답의 기술적 척추입니다. 여기서 '공정하다'는 마케팅 용어가 아닙니다. 숫자가 선택되는 방식 그 자체의 속성이죠.
3D 주사위는 정직한 연극입니다
Mini Kraken은 화면 위를 굴러다니다 멈춰 서는 진짜 3D 물리 주사위로 잘 알려져 있습니다 — 그리고 바로 이 지점에서 합리적인 사람이라면 의심을 품을 법합니다. 물리 시뮬레이션이 주사위가 어디에 떨어질지를 정한다면, 낮은 숫자에 떨어지도록 애니메이션을 손봐 둘 수도 있는 것 아닐까요?
아닙니다 — 그 이유는 일이 벌어지는 순서에 있습니다. 엔진이 먼저 숫자를 고릅니다. 그런 다음 애니메이션이 그 숫자에 떨어지라는 지시를 받습니다. 여러분이 지켜보는 구르는 주사위는, 한 박자 앞서 위에서 설명한 바로 그 편향 없는 엔진이 이미 공정하게 정해 둔 결과를 충실히 재연하는 공연입니다. 물리는 느낌을 위해 존재합니다 — 밋밋한 텍스트 결과가 눌러 없애 버리는, 그 만족스러운 달그락거림과 구름을 위해서요 — 결과를 정하기 위한 게 아니고요. 정직한 수학 위에 얹은 쇼맨십일 뿐이며, 숫자를 슬쩍 밀어 넣는 일은 말 그대로 불가능합니다. 주사위가 움직이기 시작하기도 전에 그 숫자는 이미 존재하니까요.
어디서나 하나의 엔진 — 그래서 굴림은 늘 같은 의미입니다
눈에 잘 띄지 않는 신뢰의 원천이 하나 있으니, 바로 일관성입니다. 어떤 플랫폼에서는 이곳에서의 굴림과 저곳에서의 굴림이 다르게 작동합니다. Mini Kraken에서는, 캐릭터 시트에서 톡 누르든, 가상 테이블탑에 떨어뜨리든, Fortuna가 귀 기울이고 있는 Discord 채널에 입력하든, d20은 그냥 d20입니다.
이 모든 표면이 똑같은 엔진을 호출하기 때문입니다. 웹사이트용 "상냥한" 굴림기와 Discord용 다른 굴림기가 따로 있는 게 아닙니다. 하나의 굴림은 생태계 전체에 걸쳐 정확히 똑같은 의미를 지니며, 이는 편의인 동시에 보증이기도 합니다. 확률이 슬그머니 바뀌는 특별한 모드 같은 건 없다는 뜻이니까요.
굴림을 직접 검증할 수 있습니다
"우리를 믿으세요"를 "직접 확인해 보세요"로 바꿔 주는 기능이 여기 있습니다.
이 엔진은 결정론적 재현을 지원합니다. 쉽게 말하면, 하나의 굴림은 시드(seed)라 불리는 작은 출발값에 묶일 수 있고, 같은 시드는 언제나 똑같은 결과의 연속을 그대로 재현해 냅니다. 엔진에 같은 시드를 두 번 넣으면, 매번 똑같은 주사위 눈이 나옵니다. 이는 조작된 시스템과는 정반대입니다. 조작된 굴림기는 자신이 어떻게 작동하는지 숨겨야 하지만, 우리 것은 그 조리법을 여러분 손에 쥐여 주고 같은 입력이 언제나 같고 재현 가능한 결과를 낳는다는 것을 증명해 보일 수 있습니다. 재현할 수 있는 무작위성은 곧 감사할 수 있는 무작위성입니다.
우리가 결코 하지 않는 일
공정하다는 것은 기술 못지않게 절제의 문제이기도 합니다. 그러니 분명하게, Mini Kraken의 주사위가 하지 않는 일들을 적어 두겠습니다.
- "주사위 카르마" 없음. 여러분이 운이 없었다는 걸 기록해 두었다가 몰래 좋은 굴림을 쥐여 주어 벌충해 주는 일은 절대 없습니다 — 그 반대도 마찬가지고요. 진짜 주사위가 그렇듯, 각 굴림은 서로 독립적입니다.
- 숨은 눈속임 없음. 결과가 더 기분 좋게 느껴지도록 극단값을 깎아 내는 보이지 않는 "다듬기" 같은 건 없습니다. 어떤 도구는 이걸 슬그머니 합니다. 우리는 하지 않습니다. 연속은 그냥 연속일 뿐입니다.
- 비밀 보정치 없음. 적용되는 보너스는 여러분이 굴림에서 눈으로 확인할 수 있는 것들뿐입니다 — 시트의 보정치, 어드밴티지 등등이죠. 어둠 속에서 몰래 더하거나 빼는 것은 없습니다.
- 표적 삼기 없음. 엔진은 여러분이 누구인지 알지도, 신경 쓰지도 않습니다. 게임 마스터에게 더 상냥하거나 새내기 플레이어에게 더 가혹하지 않습니다. 애초에 "플레이어"가 뭔지조차 모릅니다.
주사위는 무심합니다. 바로 그 무심함이 핵심입니다.
"그래도 내 굴림은 이상한데요"
정말 그렇게 느껴질 수 있습니다 — 그리고 그 느낌은 주사위가 완벽할 때조차 진짜입니다. 진정한 무작위성은 울퉁불퉁합니다. 우리 직관이 예상하는 것보다 훨씬 자주 연속과 군집과 얄궂은 타이밍을 만들어 내고, 우리 기억은 참사에는 매달리면서 잊어도 그만인 평범한 굴림은 슬그머니 버립니다. 공정한 d20도 이따금 1을 세 번 연달아 안겨 주기 마련입니다. 그건 편향의 증거가 아니라, 무작위성이 제 할 일을 하고 있다는 증거입니다.
'공정하다'와 '공정하게 느껴진다' 사이의 간극은 그 자체로 글 한 편을 할애할 만큼 큽니다 — 불운의 연속 뒤에 숨은 심리에 관해서는 공정한 주사위가 조작처럼 느껴지는 이유를 참고하세요. 그리고 여러분 안의 회의론자를 경험적으로 만족시키고 싶다면, 정직한 시험법은 바로 물량입니다. d20을 몇백 번 굴려 보면서 분포가 고르게 평평해지는 것을 지켜보세요. 열두 번쯤 굴리면 언제나 울퉁불퉁해 보이지만, 천 번은 진실을 말해 줍니다.
자신 있게 굴리세요
그래서, Mini Kraken은 공정할까요? 네 — 약속이 아니라 설계로써 그렇습니다. 모든 면이 똑같은 확률을 가지고, 각 숫자 뒤의 수학은 소수점까지 편향이 없으며, 3D 애니메이션은 이미 정직하게 정해진 결과를 연기할 뿐이고, 어디서나 똑같은 엔진이 돌아가며, 하나의 굴림은 믿음에 맡기는 대신 재현하고 확인할 수 있습니다.
주사위는 여러분을 사랑하지도, 미워하지도 않습니다. 그저 구를 뿐입니다. 그리고 Mini Kraken에서 주사위는 똑바로 구릅니다 — 그러니 이제 기계 장치를 향한 의심은 내려놓고, 정말 좋은 일들이 벌어지는 곳, 바로 이야기로 돌아가셔도 됩니다.