로또 번호 조합기 원리와 경우의 수 계산: 고정수·제외수부터 Fisher-Yates 셔플 알고리즘까지

로또 번호 자동/반자동 조합기

무료 · 고정수/제외수 지정 · Fisher-Yates 공정 난수 추출

매주 로또(Lotto 6/45)를 구매할 때 많은 분들이 "어떤 번호를 골라야 당첨 확률을 조금이라도 올릴 수 있을까?" 고민합니다. 순수 무작위 자동 추출을 이용하는 경우가 많지만, 자신이 분석한 당첨 기대 번호(고정수)나 반대로 출현 가능성이 낮다고 판단하는 번호(제외수)를 반영하여 나만의 커스텀 조합을 만들고 싶어 하는 분들도 많습니다.

이 글에서는 로또 6/45의 수학적 경우의 수 계산 원리부터 고정수와 제외수 필터링 적용 시 적용되는 수식, 치우침 없는 공정한 무작위 난수를 추출하기 위한 Fisher-Yates 셔플 알고리즘, 그리고 실제 로또 통계 데이터를 기반으로 한 실무 번호 조합 전략까지 깊이 있게 살펴봅니다.

핵심 요약

  1. 전체 경우의 수: 45개의 숫자 중 순서 없이 6개를 고르는 로또 6/45의 총 경우의 수는 [ C(45, 6) = 8,145,060 ]가지입니다.
  2. 필터링 축소 공식: 고정수 (m)개, 제외수 (e)개를 설정하면 선택 대상이 줄어들어 경우의 수가 [ C(45 - m - e, 6 - m) ]으로 급격히 축소됩니다.
  3. 공정성 보장: 단순 모듈러 연산의 편향을 방지하기 위해 현존 최고의 배열 셔플 알고리즘인 Fisher-Yates (Knuth) Shuffle을 적용하여 모든 조합의 출현 확률을 균등하게 만듭니다.
  4. 실전 번호 조합 전략: 홀짝 비율(3:3, 4:2, 2:4)과 번호대별 균등 분포, 총합 구간(100~175)을 고려하면 수학적으로 균형 잡힌 패턴을 만들 수 있습니다.

1. 로또 6/45의 수학적 경우의 수: C(45, 6) 공식

로또 6/45는 1부터 45까지의 서로 다른 자연수 중 6개를 중복 없이, 순서에 상관없이 선택하는 대표적인 조합(Combination) 구조입니다.

수학에서 (n)개 중 (k)개를 순서 없이 선택하는 조합 수식은 다음과 같이 정의됩니다.

[ C(n, k) = \binom{n}{k} = \frac{n!}{k!(n-k)!} ]

이를 로또 6/45 조건에 대입하여 전개해 보면 다음과 같습니다.

[ C(45, 6) = \frac{45 \times 44 \times 43 \times 42 \times 41 \times 40}{6 \times 5 \times 4 \times 3 \times 2 \times 1} ]

분자와 분모를 각각 계산하면 다음과 같습니다.

  • 분자 (순열 P(45, 6)): (45 \times 44 \times 43 \times 42 \times 41 \times 40 = 5,864,443,200)
  • 분모 (6!): (6 \times 5 \times 4 \times 3 \times 2 \times 1 = 720)

따라서 최종 경우의 수는 다음과 같이 산출됩니다.

[ C(45, 6) = \frac{5,864,443,200}{720} = 8,145,060 ]

즉, 1등에 당첨될 수학적 확률은 정확히 (\frac{1}{8,145,060}) (약 0.00001227%)입니다. 이는 814만 5천 60장의 서로 다른 게임을 모두 구매해야만 1등 1장이 반드시 포함되는 수치입니다.


2. 고정수와 제외수 필터링 시 경우의 수 축소 수식

로또 번호를 조합할 때 내가 꼭 넣고 싶은 숫자(고정수)나 절대로 넣고 싶지 않은 숫자(제외수)를 지정하면 후보군과 선택 슬롯이 동시에 줄어듭니다.

수학적 일반 공식

  • 전체 번호 개수: (N = 45)
  • 선택할 번호 개수: (K = 6)
  • 지정한 고정수 개수: (m) ((0 \le m \le 6))
  • 지정한 제외수 개수: (e) ((0 \le e \le 45 - m))

고정수 (m)개는 이미 6개 슬롯 중 (m)자리를 차지했으므로 남은 슬롯은 (6 - m)개가 됩니다. 제외수 (e)개와 고정수 (m)개는 남아있는 뽑기 대상에서 제외되므로, 선택 가능한 남은 후보 번호는 (45 - m - e)개가 됩니다.

따라서 고정수 (m)개와 제외수 (e)개를 적용한 경우의 수 축소 공식은 다음과 같습니다.

[ \text{가능한 조합 수} = C(45 - m - e, 6 - m) = \frac{(45 - m - e)!}{(6 - m)! \cdot (39 - e)!} ]

필터링 적용 예시 계산

예시 1: 고정수 2개, 제외수 5개 설정

  • 고정수 (m = 2), 제외수 (e = 5)
  • 남은 후보군: (45 - 2 - 5 = 38)개
  • 선택할 남은 슬롯: (6 - 2 = 4)개

[ C(38, 4) = \frac{38 \times 37 \times 36 \times 35}{4 \times 3 \times 2 \times 1} = \frac{2,714,040}{24} = 73,815 ]

단 2개의 고정수와 5개의 제외수만 지정하더라도 전체 경우의 수가 8,145,060개에서 73,815개로 기존 대비 약 99.09% 축소됩니다.

예시 2: 고정수 3개, 제외수 10개 설정

  • 고정수 (m = 3), 제외수 (e = 10)
  • 남은 후보군: (45 - 3 - 10 = 32)개
  • 선택할 남은 슬롯: (6 - 3 = 3)개

[ C(32, 3) = \frac{32 \times 31 \times 30}{3 \times 2 \times 1} = \frac{29,760}{6} = 4,960 ]

고정수가 3개로 늘고 제외수가 10개가 되면 조합의 경우의 수는 불과 4,960개로 줄어듭니다. 이는 나만의 특정 분석 모델이나 패턴에 따라 대상 범위를 대폭 압축할 수 있음을 수학적으로 보여줍니다.


3. Fisher-Yates 셔플 알고리즘을 이용한 공정 난수 추출

수학적 경우의 수를 줄인 후, 남은 후보군에서 6개의 번호를 뽑을 때 가장 중요한 것은 **모든 번호가 동등한 확률로 선택되는 공정성(Uniform Randomness)**입니다.

단순 무작위 방식(Naive Approach)의 문제점

흔히 사용하는 (Math.random())으로 매번 번호를 하나씩 무작위로 뽑아 중복을 제거하는 방식은 다음과 같은 문제점이 발생할 수 있습니다.

  1. 편향(Modulo Bias / Sampling Bias): 비균등한 샘플링으로 특정 숫자가 더 자주 뽑히는 편향이 생길 수 있습니다.
  2. 시간 복잡도 비효율: 이미 뽑힌 번호가 계속 다시 나오면 (while) 루프가 불필요하게 오래 반복될 수 있습니다.

Fisher-Yates (Knuth) 셔플의 원리

Fisher-Yates 셔플은 크기가 (N)인 배열의 원소들을 시간 복잡도 (\mathcal{O}(N)) 만에 완전히 무작위로 섞는 최적의 알고리즘입니다. 모든 원소가 모든 위치에 올 확률이 정확히 (\frac{1}{N!})로 균등하게 보장됩니다.

작동 순서는 다음과 같습니다.

  1. 후보 번호가 들어있는 배열 (P)를 작성합니다.
  2. 배열의 마지막 인덱스 (i = N - 1)부터 시작하여 (i = 1)까지 역순으로 훑어 내려갑니다.
  3. (0)부터 (i) 사이의 임의의 정수 인덱스 (j)를 무작위로 선택합니다.
  4. (P[i])와 (P[j])의 위치를 서로 교환(Swap)합니다.
  5. 셔플이 완료된 배열의 앞에서부터 필요한 개수만큼 순서대로 추출합니다.

4. 반자동 모드(일부 고정, 나머지 무작위) 작동 원리

로또 구매 시 가장 인기가 높은 '반자동' 방식은 사용자가 확신을 갖는 일부 번호(고정수)를 미리 결정해 두고, 나머지 빈 슬롯은 시스템이 알아서 무작위로 채워주는 방식입니다.

웹 기반 로또 조합기 도구에서의 내부 실행 워크플로는 다음과 같이 정교하게 동작합니다.

  1. 입력값 유효성 검증(Validation):
    • 고정수 개수 (m)이 (0 \le m \le 6) 범위 내에 있는지 확인합니다.
    • 고정수와 제외수 집합 간에 교집합((F \cap E = \emptyset))이 없는지 검사합니다.
    • (45 - m - e \ge 6 - m) 조건(남은 후보수가 선택 슬롯 수 이상)을 만족하는지 검증합니다.
  2. 후보군(Candidate Pool) 구성:
    • 전체 집합 ({1, 2, \dots, 45})에서 고정수 집합 (F)와 제외수 집합 (E)를 차감한 남아있는 번호 배열 (P)를 생성합니다.
  3. Fisher-Yates 무작위 추출:
    • 배열 (P)에 Fisher-Yates 셔플 알고리즘을 적용합니다.
    • 셔플된 배열의 앞쪽에서 ((6 - m))개의 번호를 슬라이싱하여 추출합니다.
  4. 조합 병합 및 정렬(Merge & Sort):
    • 사용자가 미리 고정한 (m)개의 번호와 새로 뽑힌 ((6 - m))개의 무작위 번호를 하나로 합칩니다.
    • 6개의 번호를 오름차순으로 정렬하여 가독성이 높은 최종 로또 조합을 완성합니다.
로또 번호 자동/반자동 조합기

무료 · 고정수/제외수 지정 · Fisher-Yates 공정 난수 추출


5. JavaScript로 구현하는 로또 조합 생성기 코드

다음은 고정수와 제외수 필터링, 그리고 Fisher-Yates 셔플을 반영한 로또 조합 생성기의 실제 JavaScript/TypeScript 구현 예제 코드입니다.

/**
 * 로또 6/45 커스텀 조합 생성 함수
 * @param fixedNumbers 반드시 포함할 고정수 배열 (0~6개)
 * @param excludedNumbers 제외할 번호 배열
 * @returns 오름차순 정렬된 6개의 로또 번호 배열
 */
function generateLottoNumbers(
  fixedNumbers: number[] = [],
  excludedNumbers: number[] = []
): number[] {
  // 1. 중복 제거 및 Set 변환
  const fixedSet = new Set(fixedNumbers);
  const excludedSet = new Set(excludedNumbers);

  // 2. 입력값 유효성 검사
  if (fixedSet.size > 6) {
    throw new Error("고정수는 최대 6개까지 설정할 수 있습니다.");
  }

  for (const num of fixedSet) {
    if (excludedSet.has(num)) {
      throw new Error("고정수와 제외수에 중복된 번호(" + num + ")가 존재합니다.");
    }
  }

  // 3. 남은 후보군(Candidate Pool) 생성
  const candidatePool: number[] = [];
  for (let i = 1; i <= 45; i++) {
    if (!fixedSet.has(i) && !excludedSet.has(i)) {
      candidatePool.push(i);
    }
  }

  const neededRandomCount = 6 - fixedSet.size;

  if (candidatePool.length < neededRandomCount) {
    throw new Error("제외수가 너무 많아 6개 번호를 조합할 수 없습니다.");
  }

  // 4. Fisher-Yates 셔플 알고리즘 적용
  const shuffled = [...candidatePool];
  for (let i = shuffled.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
  }

  // 5. 무작위 번호 추출 및 고정수와 병합
  const selectedRandom = shuffled.slice(0, neededRandomCount);
  const finalCombination = [...Array.from(fixedSet), ...selectedRandom];

  // 6. 오름차순 정렬하여 반환
  return finalCombination.sort((a, b) => a - b);
}

// 사용 예시: 고정수 [7, 14], 제외수 [3, 10, 21, 35, 42]
const myLottoNumbers = generateLottoNumbers([7, 14], [3, 10, 21, 35, 42]);
console.log("생성된 로또 번호:", myLottoNumbers);

위 코드처럼 Fisher-Yates 셔플을 이용하면 불필요한 재귀 루프나 무한 반복 없이 항상 정확히 (\mathcal{O}(N))의 시간 복잡도로 신속하게 공정한 무작위 조합을 만들어 냅니다.


6. 실무 로또 조합 전략 팁 (통계 데이터 및 패턴 고려)

수학적으로 8,145,060가지의 모든 조합은 당첨 확률이 (\frac{1}{8,145,060})로 완벽히 동일합니다. 하지만 역사적 출현 통계를 분석해보면 극단적인 패턴의 조합은 실제 당첨 번호로 등장할 확률이 지극히 희박합니다. 번호를 조합할 때 고려하면 좋은 4가지 실무 팁을 소개합니다.

1) 홀짝 비율 (Odd:Even Ratio) 밸런스

역대 로또 6/45 당첨 번호의 홀수와 짝수 비율 통계를 조사해보면 다음과 같은 분포를 보입니다.

  • 3:3 비율 (홀수 3개, 짝수 3개): 전체 출현 빈도의 약 33%
  • 4:2 또는 2:4 비율: 각각 전체 출현 빈도의 약 26~27%
  • 5:1 또는 1:5 비율: 각각 전체 출현 빈도의 약 7~8%
  • 6:0 또는 0:6 (전체 홀수 / 전체 짝수): 각각 1.2% 미만

즉, **[3:3], [4:2], [2:4]**의 균형 잡힌 홀짝 비율 조합이 전체 당첨 번호의 약 86% 이상을 차지합니다. 따라서 번호를 구성할 때 전부 홀수이거나 전부 짝수인 조합은 피하는 것이 유리합니다.

2) 번호대별 균등 분포 (Number Range Spread)

로또 45개 번호는 10개 단위로 5개 구간(단번대 110, 10번대 1120, 20번대 2130, 30번대 3140, 40번대 41~45)으로 나뉩니다.

  • 특정 한 두 번호대에 6개 숫자가 모두 몰려있는 경우(예: 1, 3, 5, 7, 8, 9)는 역사적으로 출현 확률이 매우 적습니다.
  • 일반적인 당첨 조합은 보통 3~4개 이상의 다양한 번호대에 골고루 분산되어 출현합니다.

3) 번호 합계 범위 (Total Sum Range)

6개 번호의 합계(Sum)를 구했을 때 나올 수 있는 이론상 최소 합계는 (1+2+3+4+5+6 = 21)이고, 최대 합계는 (40+41+42+43+44+45 = 255)입니다.

중앙 기대값은 다음과 같습니다.

[ \text{기대 평균 합계} = 6 \times \frac{1 + 45}{2} = 138 ]

실제 역대 당첨 번호 6개의 합계를 조사해보면 약 80% 이상의 당첨 번호가 합계 100 ~ 175 구간 사이에 집중되어 있습니다. 총합이 지나치게 작거나(100 미만) 지나치게 큰(180 초과) 조합은 피하는 것이 바람직합니다.

4) 연속 번호(Consecutive Numbers) 출현 패턴

  • 6개 번호 중 연속된 두 숫자(예: 14, 15)가 1쌍 포함될 확률은 전체 회차의 약 **55~60%**에 달할 정도로 자주 등장합니다.
  • 하지만 3연속 번호(예: 14, 15, 16)나 4연속 번호 이상의 극단적인 연속 배치는 출현 빈도가 극히 낮으므로 조합 시 주의해야 합니다.

7. 자주 묻는 질문 (FAQ)

Q1. 고정수를 많이 설정할수록 당첨 확률이 올라가나요?

고정수로 설정한 번호가 실제 당첨 번호에 포함되는 경우에는 필요한 나머지 번호 수가 줄어들어 당첨 확률이 비약적으로 상승합니다. 그러나 고정수로 선택한 번호 중 단 1개라도 당첨 번호에서 벗어나면 해당 게임은 1등 당첨이 불가능해집니다. 따라서 고정수는 본인이 강력한 통계적 근거를 갖고 있는 경우에만 1~3개 내외로 신중하게 설정하는 것이 좋습니다.

Q2. 제외수를 설정할 때 주의할 점은 무엇인가요?

최근 510주간 출현하지 않은 장기 미출현수나 특정 번호대 과다 출현으로 인해 당분간 쉴 것으로 예상되는 번호를 제외수로 활용할 수 있습니다. 다만 제외수를 너무 과도하게(예: 20개 이상) 설정하면 실제 당첨 번호가 제외수에 포함될 위험이 커지므로, 515개 안팎의 적정 범위 내에서 제외수를 운용하는 것을 권장합니다.

Q3. 이 조합기로 생성한 번호는 완전 무작위인가요?

네, 본 도구는 암호학적으로 안전한 난수 생성 원리와 Fisher-Yates 셔플 알고리즘을 기반으로 작동하므로 특정 번호가 더 자주 뽑히거나 시스템 편향이 발생하지 않는 100% 공정한 무작위 조합을 보장합니다.


본 가이드에서 제공하는 정보는 수학적 경우의 수 계산과 통계적 정보 제공을 목적으로 작성되었습니다.

가격 보기카톡 무료 상담