도구스개발

가중 무작위 추출(별칭 방법) 계산기

확률이 제각각인 항목을 O(1)로 뽑게 해 주는 별칭 표(Walker alias table)를 만듭니다. 표가 되돌려 주는 확률을 정확히 합산해 입력과 같은지 검산하고, 뽑는 과정도 한 번 보여 줍니다.

쉼표로 구분합니다. 「이름:가중치」로 적으면 이름이 함께 나옵니다. 합이 100이 아니어도 됩니다.

0 이상 1 미만. 이 하나로 주사위(칸)와 동전(주인/별칭)을 모두 정합니다.

3칸 중 2번 칸 · 동전 0.26

R

난수 0.42에 3을 곱해 정수부 1로 칸을 고르고, 소수부 0.26로 그 칸의 두 후보 중 하나를 골랐습니다. 이번에는 별칭이 나왔습니다.

항목 수3개
가중치 합100
표를 만들 때 물 옮긴 횟수2번
별칭 방법 뽑기 비용주사위 1번 + 동전 1번 (O(1))
누적합 + 이분 탐색누적합에서 이분 탐색 약 2번 (O(log n))
표 검산입력 확률과 정확히 일치

별칭 표

주인주인 몫별칭복원 확률
1SSR1.8%R0.6%
2SR16.2%R5.4%
3R100%없음 (통째로 자기 칸)94%

칸 k를 고른 뒤 [0,1) 난수가 주인 몫보다 작으면 주인을, 아니면 별칭을 냅니다. 「복원 확률」은 표를 훑어 각 항목이 나올 확률을 정확히 합산한 값입니다 — 입력한 비율과 같아야 표가 맞는 것입니다.

입력 확률과 복원 확률

항목가중치입력 확률표에서 복원
SSR0.60.6%0.6%
SR5.45.4%5.4%
R9494%94%
표를 만드는 그림은 이렇습니다. 칸이 3개인 상자에 각 항목의 확률에 3을 곱한 물을 붓습니다. 물의 총량이 3이라 평균이 딱 1이 되고, 넘치는 칸에서 모자란 칸으로 물을 옮겨 모든 칸을 1로 채웁니다. 채워진 칸에는 원래 주인과, 물을 대 준 항목이 「별칭」으로 함께 남습니다.
누적합을 만들어 이분 탐색하면 뽑을 때마다 O(log n)이 듭니다. 별칭 방법은 표를 한 번 만들어 두면 주사위 한 번 + 동전 한 번으로 끝나 O(1)입니다. 확률이 바뀌지 않는데 여러 번 뽑아야 할 때(가챠·몬테카를로·파티클) 값이 큽니다. 대신 확률이 바뀔 때마다 표를 다시 만들어야 합니다.
이 계산기는 확률을 실수로 두지 않고 정수로 스케일해 표를 만듭니다. 물을 옮길 때마다 뺄셈이 쌓이면 부동소수점 오차로 마지막 칸이 1에서 어긋나고, 큰 쪽/작은 쪽 판정이 뒤집혀 표가 망가지기 때문입니다. 「복원 확률」이 입력과 정확히 같은 것으로 그것을 확인할 수 있습니다.

사용 방법

  1. 1가중치를 쉼표로 구분해 넣습니다. 「SSR:0.6, SR:5.4, R:94」처럼 이름을 붙여도 됩니다.
  2. 2별칭 표에서 각 칸의 주인 몫과 별칭을 확인합니다.
  3. 3「입력 확률과 복원 확률」 표에서 두 값이 같은지 봅니다. 같아야 표가 맞는 것입니다.
  4. 4난수 u를 바꿔 가며 어떤 칸이 걸리고 주인과 별칭 중 무엇이 나오는지 확인합니다.

자주 묻는 질문

확률이 서로 다른 항목 중 하나를 O(1)에 뽑게 해 주는 표를 만드는 방법입니다. 1974년 워커(Walker)가 낸 것으로, 칸 n개짜리 상자에 각 항목의 확률×n만큼 물을 붓고 넘치는 칸에서 모자란 칸으로 물을 옮겨 모든 칸 높이를 1로 맞춥니다. 채워진 칸에는 원래 주인과 물을 대 준 항목이 「별칭」으로 함께 남습니다.

뽑기 한 번의 비용이 O(log n)에서 O(1)로 줄어듭니다. 누적합 방식은 난수 하나를 누적 배열에서 이분 탐색해야 하지만, 별칭 방법은 주사위를 굴려 칸을 고르고 동전을 한 번 던져 그 칸의 두 후보 중 하나를 고르면 끝입니다. 대신 표를 만드는 데 O(n)이 들고, 확률이 바뀌면 표를 다시 만들어야 합니다.

난수 u에 항목 수 n을 곱해 정수부로 칸을, 소수부로 동전을 대신합니다. u = 0.42이고 n = 3이면 1.26이 되어 1번 칸(0부터 세어)을 고르고 0.26을 그 칸의 주인 몫과 견줍니다. 난수 발생기를 한 번만 부르면 되니 실제 구현에서 흔히 쓰는 방법입니다.

표를 훑어 각 항목이 뽑힐 확률을 정확히 합산해 입력 확률과 비교합니다. 항목 k의 확률은 (1/n)×[칸 k의 주인 몫 + 별칭이 k인 칸들의 남은 몫의 합]입니다. 이 계산기는 이 값을 분수로 통분해 입력과 같은지 보므로 「거의 같다」가 아니라 정확히 같은지를 확인합니다.

부동소수점 누적 오차가 표를 망가뜨리기 때문입니다. 물을 옮길 때마다 뺄셈이 쌓이면 마지막 칸이 1에서 미세하게 어긋나고, 큰 쪽·작은 쪽 판정이 뒤집혀 남은 항목이 잘못된 별칭을 갖게 됩니다. 이 계산기는 가중치를 정수로 스케일해 정수 비교만으로 표를 만듭니다.

쓸 수 있습니다. 「SSR:0.6, SR:5.4, R:94」처럼 퍼센트를 그대로 넣으면 되고, 합이 100이 아니어도 알아서 비율로 다룹니다. 다만 이 계산기가 보이는 것은 표와 이론 확률이지, 실제 게임의 천장·픽업 같은 규칙은 다루지 않습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 검증은 몬테카를로가 아니라 계산으로 했습니다. 만들어진 표를 훑어 각 항목의 이론 확률을 BigInt 분수로 정확히 합산해 입력 확률과 같은지 확인합니다. 균등·쏠린 분포, 0이 섞인 경우, 소수 자릿수가 많은 경우, 항목 수 2~24개, 무작위 가중치 200벌을 모두 이 방식으로 대조했습니다.
  • 난수 u를 0부터 1까지 20만 번 훑어 각 항목이 나오는 폭이 입력 확률과 맞는지도 따로 확인했습니다. 표만 검산하는 것과 달리 뽑는 코드까지 함께 보는 검사입니다.
  • 부동소수점을 쓰지 않습니다. 가중치를 정수로 스케일해 분모를 공통으로 두고 BigInt로 물을 옮깁니다. 실수로 구현하면 마지막 칸이 1에서 어긋나 표가 망가지는 것이 이 알고리즘의 고전적인 함정입니다.
  • 표를 만들 때 물을 옮기는 횟수는 최대 n−1번입니다. 한 번 옮길 때마다 처리가 끝난 항목이 하나 늘기 때문이고, 이것이 표 만들기가 O(n)인 이유입니다.
  • 항목은 24개까지, 가중치 하나는 100만까지 다룹니다. 정수 스케일이 안전한 범위 안에 들도록 잡은 값입니다.
  • 표는 확률이 고정돼 있을 때만 값이 있습니다. 뽑을 때마다 확률이 바뀌는 경우(비복원 추출 등)에는 표를 매번 다시 만들어야 해서 이득이 없습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.