Java/자바 정리

111. 난수로 로또 번호 만들기 – Random 클래스 vs Math.random()

코딩하는냥이 2025. 5. 14. 11:58
반응형

이번 글에서는 java.util.Random 클래스를 사용해 무작위 숫자(난수)를 생성하고,
직접 고른 번호와 당첨 번호를 비교해 로또 시뮬레이션을 해보는 예제를 실습합니다.
그리고 마지막에는 Math.random()과의 차이점도 함께 정리합니다.


📌 예제 코드

import java.util.Arrays;
import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        int[] selectNum = new int[6];
        Random rand = new Random(3);  // 시드 값 3

        System.out.print("선택 번호 : ");
        for (int i = 0; i < selectNum.length; i++) {
            selectNum[i] = rand.nextInt(45) + 1;  // 1~45 사이 난수 생성
            System.out.print(selectNum[i] + " ");
        }
        System.out.println();

        int[] winningNum = new int[6];
        rand = new Random(5);  // 시드 값 5 (다르게 설정됨)

        System.out.print("당첨 번호 : ");
        for (int i = 0; i < selectNum.length; i++) {
            winningNum[i] = rand.nextInt(45) + 1;
            System.out.print(winningNum[i] + " ");
        }
        System.out.println();

        Arrays.sort(selectNum);
        Arrays.sort(winningNum);
        boolean result = Arrays.equals(selectNum, winningNum);

        System.out.print("당첨 여부 : ");
        if (result)
            System.out.println("1등에 당첨되었습니다.");
        else
            System.out.println("당첨되지 않았습니다.");
    }
}

💻 실행 결과

선택 번호 : 40 15 41 2 28 21 
당첨 번호 : 38 4 41 35 11 12 
당첨 여부 : 당첨되지 않았습니다.

💬 코드 설명

  • Random rand = new Random(seed) 형태로 생성 시, 시드(seed) 값이 같으면 항상 동일한 난수 시퀀스가 생성됩니다.
  • rand.nextInt(45) + 1은 1부터 45까지의 정수를 무작위로 하나 생성합니다.
  • 두 개의 int[] 배열(selectNum, winningNum)은 서로 다른 시드를 사용하여 각각 번호를 생성합니다.
  • Arrays.sort()로 정렬한 뒤 Arrays.equals()로 배열 내용이 동일한지 비교합니다.
  • 결과가 같다면 1등 당첨, 다르면 미당첨으로 출력됩니다.

💡 포인트 정리

  • Random 클래스는 시드 값을 설정하면 항상 같은 난수를 재현할 수 있어 테스트에 유리합니다.
  • nextInt(n)은 0 이상 n 미만의 정수를 반환하며, 범위를 조정하려면 +1 등으로 보정 필요
  • 배열을 정렬한 후 비교하면 순서가 달라도 값이 같을 때 동등하다고 판단 가능합니다.

🔄 Math.random()과의 차이점

항목 Random 클래스 Math.random()
반환 값 다양한 타입 (int, double, long, ...) double (0.0 이상 1.0 미만)
시드(seed) 설정 가능 (new Random(seed)) 불가능 (내부 시드 자동 설정)
재현 가능성 시드가 같으면 항상 동일한 난수 순서 생성 재현 불가 (실행마다 난수 순서가 다름)
객체 생성 여부 Random 인스턴스 필요 클래스 메서드이므로 객체 없이 호출 가능

✅ Random은 다양한 유형의 난수를 만들고, 시드 설정이 가능하여 테스트나 시뮬레이션에 적합
✅ Math.random()은 간편하지만 단순한 double 값만 생성 가능


📌 정리하자면, Random 클래스를 사용하면 다양한 유형의 난수를 쉽게 생성할 수 있으며,
시드를 지정해 반복 가능한 난수 시퀀스를 만들 수 있어 테스트용 코드에서 매우 유용합니다.
간단한 경우엔 Math.random()도 충분하지만, 정밀한 제어가 필요하다면 Random 클래스가 더 적합합니다.