도구스개발

나머지 연산 난수 편향 계산기

rand() % n이 앞쪽 값을 얼마나 더 자주 내는지 계산합니다. 편향된 값의 개수와 배수, 총변동거리, 그리고 기각 표집으로 없앨 때 평균 몇 번을 다시 뽑아야 하는지까지 냅니다.

쓰는 난수 생성기가 내는 값의 가짓수입니다

rand() % n의 n입니다

이만큼 뽑았을 때 얼마나 치우치는지 보여 줍니다

앞쪽 값이 더 자주 나옵니다

앞쪽 4개가 1배

M = n·q + r → 4,294,967,296 = 6×715,827,882 + 4

몫 q = ⌊M/n⌋715,827,882
나머지 r = M mod n — 편향된 값의 개수4
앞쪽 4개가 나올 확률1.666667e-1
나머지 2개가 나올 확률1.666667e-1
고르다면 1/n1.666667e-1
몇 배 더 자주 나오는가 (q+1)/q1.000000001
총변동거리 r(n−r)/(nM)3.1044e-10
기각 표집의 상한 n·q4,294,967,292
받아들일 확률100%
버리는 비율0%
평균 몇 번 뽑아야 하나1
1,000,000번 뽑았을 때 — 앞쪽 값 하나의 초과분0
앞쪽 전체의 초과분0
계산 근거4,294,967,296 = 6 × 715,827,882 + 40 … 3715,827,883번씩, 45715,827,882번씩 나올 수 있음M을 n으로 나눈 나머지 4개만큼 앞쪽 값에 «한 번씩 더» 대응되는 난수가 있습니다. 그래서 그 값들이 1배 더 자주 나옵니다.
편향의 크기는 n/M 규모입니다. q ≈ M/n이므로 편향은 1/q ≈ n/M입니다. 지금은 1배라 사실상 보이지 않습니다. 다만 n이 M의 절반을 넘으면 q = 1이 되어 앞쪽 값이 «정확히 두 배» 나옵니다. 랜덤 셔플이나 추첨처럼 n이 클 때 이것이 실제로 결과를 치우치게 합니다.
기각 표집으로 완전히 없앨 수 있습니다. 편향은 «남는 꼬리» 4개 때문이므로, x ≥ 4,294,967,292인 난수를 버리고 다시 뽑으면 남은 범위가 n으로 정확히 나누어떨어져 완전히 고르게 됩니다. 지금 설정에서 버리는 비율은 0%이고 평균 1번 뽑으면 됩니다. 최악이라도 평균 2번을 넘지 않습니다 — n < M이면 n·q가 M의 절반을 넘기 때문입니다. 「다시 뽑으면 느려진다」는 걱정으로 편향을 그냥 두는 것은 값싼 선택이 아닙니다.
2⁶⁴는 실수로 정확히 표현되지 않습니다. 흔히 쓰는 난수 범위가 2³², 2⁵³, 2⁶⁴인데 마지막 것은 배정밀도 실수로 딱 떨어지지 않습니다. 나머지를 실수로 구하면 이 계산의 핵심이 뭉개지므로, 이 계산기는 몫과 나머지를 정수(BigInt)로 구하고 확률만 실수로 바꿉니다.

사용 방법

  1. 1쓰는 난수 생성기의 범위 M을 고릅니다. 32비트 난수면 2³²입니다.
  2. 2줄이려는 범위 n을 넣습니다. rand() % n의 n입니다.
  3. 3앞쪽 몇 개의 값이 몇 배 더 자주 나오는지 확인합니다.
  4. 4기각 표집으로 없앨 때 평균 몇 번 다시 뽑아야 하는지 봅니다.

자주 묻는 질문

M이 n으로 나누어떨어지지 않으면 앞쪽 값들에 난수가 한 번씩 더 대응되기 때문입니다. M = n·q + r로 쓰면 0부터 r−1까지는 q+1개의 난수가, 나머지는 q개가 대응됩니다. 그래서 앞쪽 r개의 값이 (q+1)/q배 더 자주 나옵니다. r이 0이면, 즉 나누어떨어지면 편향이 전혀 없습니다.

q ≈ M/n이므로 편향의 크기는 1/q, 곧 n/M 규모입니다. 주사위(n=6)를 32비트 난수로 뽑으면 7억분의 1이라 평생 알아채지 못합니다. 하지만 n이 M에 가까워질수록 커지고, n이 M의 절반을 넘으면 q = 1이 되어 앞쪽 값이 정확히 두 배 나옵니다.

n이 클 때입니다. 랜덤 셔플, 추첨, 큰 범위에서의 표본 추출처럼 n이 난수 범위에 비해 크면 결과가 눈에 띄게 치우칩니다. 반대로 n이 작고 M이 크면 실용적으로는 무시할 수 있지만, 암호학적 용도라면 크기와 무관하게 없애야 합니다.

기각 표집을 씁니다. x < n·q일 때만 받아들이고 그보다 크면 버리고 다시 뽑으면, 남은 범위가 n으로 정확히 나누어떨어져 완전히 고르게 됩니다. 버리는 비율은 r/M이라 대개 무시할 만합니다.

최악이라도 평균 2번을 넘지 않습니다. n이 M보다 작으면 n·q가 M의 절반을 넘기 때문입니다. 대부분의 경우 버리는 비율이 백만분의 1 이하라 사실상 한 번에 끝납니다. 속도 걱정으로 편향을 그냥 두는 것은 값싼 선택이 아닙니다.

M도 2의 거듭제곱이라면 안전합니다. 그때는 나누어떨어져 나머지가 0이 됩니다. 다만 옛 rand()처럼 M이 2¹⁵나 RAND_MAX+1이 아닌 값인 경우가 있고, n이 실행 중에 정해지는 값이라면 2의 거듭제곱임을 보장할 수 없습니다.

실제 분포가 완전히 고른 분포와 얼마나 떨어져 있는지를 하나의 수로 나타낸 것이며, r(n−r)/(nM)입니다. 각 값의 확률 차이를 모두 더해 2로 나눈 값과 같습니다. 나머지가 0이면 0이고, r이 n의 절반 근처일 때 가장 큽니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 난수 생성기 자체는 고르다고 보고, 범위를 줄이는 과정에서만 생기는 편향을 다룹니다.
  • M이 n으로 나누어떨어지면 편향이 전혀 없습니다.
  • 편향의 크기는 n/M 규모입니다. n이 M의 절반을 넘으면 앞쪽 값이 정확히 두 배 나옵니다.
  • 기각 표집으로 완전히 없앨 수 있고, 평균 뽑는 횟수는 최악이라도 2번을 넘지 않습니다.
  • 2⁶⁴는 배정밀도 실수로 정확하지 않아 몫과 나머지를 정수(BigInt)로 구합니다.
  • n은 2⁵³까지 다룹니다.

함께 보면 좋은 도구

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