자바를 사용한 로또 번호 생성기: Math.random() vs Collections.shuffle()


자바를 사용해서 로또 번호를 생성하는 방법에 대해 이야기해보려고 합니다. 여기서는 두 가지 방법을 소개하려고 하는데요, 하나는 Math.random() 함수를 사용하는 방법이고, 다른 하나는 Collections.shuffle() 메서드를 사용하는 방법입니다.

먼저, Math.random() 함수는 0.0 이상 1.0 미만의 부동소수점 숫자를 무작위로 반환합니다. 이 숫자를 특정 범위의 정수로 변환하기 위해서는 추가적인 연산이 필요합니다. 예를 들어, 1부터 45까지의 랜덤한 정수를 얻기 위해선 아래와 같은 코드를 작성해야 합니다.


int number = (int)(Math.random() * 45) + 1;





이제 이를 이용해서 로또 번호를 생성해 보겠습니다.


package lotto;

public class lotto {

	public static void main(String[] args) {

		int[] lottoNumbers = new int[6];
		
		for (int i=0; i<lottoNumbers.length; i++) {
			
			int number = (int)(Math.random() * 45) + 1;

			for (int j = 0; j < i; j++) {	
				if(lottoNumbers[j] == number) {
					i--;
					break;
				}
			}
			
			lottoNumbers[i] = number;
		}
		
		System.out.println("   로또 번호 출력   ");
		System.out.println("=================");
		for (int i=0; i<lottoNumbers.length; i++) {
			System.out.print(lottoNumbers[i] + " ");
		}
	}

}




다음으로, Collections.shuffle() 메서드는 주어진 리스트의 요소를 무작위로 섞습니다. 이 메서드를 사용하면, 1부터 45까지의 숫자를 담은 리스트를 생성하고, 이를 섞어서 로또 번호를 생성할 수 있습니다.

이 방식은 Math.random() 함수를 사용하는 것보다 코드가 약간 더 길지만, 특정 범위의 모든 숫자를 한 번씩만 사용하고 싶을 때 유용하기 때문에, Math.random() 함수를 사용할때와 다르게 중복된 숫자를 확인하는 코드를 작성할 필요가 없습니다.


package lotto;

import java.util.ArrayList;
import java.util.Collections;

public class lotto {

    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();

        for(int i = 1; i <= 45; i++) {
            numbers.add(i);
        }

        Collections.shuffle(numbers);

		System.out.println("   로또 번호 출력   ");
		System.out.println("=================");
        for(int i = 0; i < 6; i++) {
            System.out.print(numbers.get(i) + " ");
        }
    }
}




결국 두 방법 모두 무작위 숫자를 생성하는데 사용할 수 있지만, Math.random()은 단일 무작위 숫자를 생성하는 데에, Collections.shuffle()은 주어진 리스트의 요소를 무작위로 섞는 데에 각각 장점이 있습니다. 로또 번호를 생성하는 경우에는 후자가 더 적합한 방법일 수 있습니다.


추가적으로, 사용자로부터 원하는 로또 번호 생성 횟수를 입력받아, 그 숫자만큼 로또 번호를 생성해주는 기능을 추가해 보았습니다. 이 코드는 java.util.Scanner 클래스를 사용하여 사용자의 입력을 받습니다.


package lotto;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class lotto {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("로또 번호를 몇 번 생성하시겠습니까? ");
		int repeatTimes = sc.nextInt();
		
		System.out.println("   로또 번호 출력   ");
		System.out.println("=================");
		
		for (int i=1; i <= repeatTimes; i++) {
			
	        ArrayList<Integer> numbers = new ArrayList<>();

	        for(int j = 1; j <= 45; j++) {
	            numbers.add(j);
	        }

	        Collections.shuffle(numbers);


			System.out.print("[" + i + "] ");
	        for(int j = 0; j < 6; j++) { 	
	            System.out.print(numbers.get(i) + " ");
	        }
		
	        System.out.println("\n");
		}
		
		sc.close();
    }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다