나머지 연산 난수 편향 계산기
rand() % n이 앞쪽 값을 얼마나 더 자주 내는지 계산합니다. 편향된 값의 개수와 배수, 총변동거리, 그리고 기각 표집으로 없앨 때 평균 몇 번을 다시 뽑아야 하는지까지 냅니다.
쓰는 난수 생성기가 내는 값의 가짓수입니다
rand() % n의 n입니다
이만큼 뽑았을 때 얼마나 치우치는지 보여 줍니다
앞쪽 값이 더 자주 나옵니다
앞쪽 4개가 1배
M = n·q + r → 4,294,967,296 = 6×715,827,882 + 4
사용 방법
- 1쓰는 난수 생성기의 범위 M을 고릅니다. 32비트 난수면 2³²입니다.
- 2줄이려는 범위 n을 넣습니다. rand() % n의 n입니다.
- 3앞쪽 몇 개의 값이 몇 배 더 자주 나오는지 확인합니다.
- 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일 · 결과는 참고용 추정치입니다.