자동로또번호 (1)

💻 Programming/Java

[Java] 로또 번호 자동 생성기 만들기

2019년 6월 15일 로또 1등 당첨번호

이번에는 자바로 로또 번호 자동 생성기를 만들어보도록 하겠습니다.

자바로 프로그래밍을 하기전에 우선 로또의 규칙부터 알아야 겠죠.

로또에는 1부터 45까지의 숫자가 존재하고

보너스 번호를 포함하여 총 7개의 숫자를 랜덤하게 뽑습니다.

각 숫자는 중복되어 선택할 수 없습니다.

여기서 키 포인트 단어는 바로 랜덤과 중복 입니다.

자바에서 중복을 제거하는 가장 좋은 방법은 Set을 이용하는 방법입니다.

 

자, 그럼 랜덤하게 숫자를 구하는 것부터 해보도록 하겠습니다.

자바에서 랜덤한 숫자를 얻을 때는 Math.random() 메서드를 이용합니다.

그런데 이 메서드는 0부터 1사이의 double 형태의 소수를 리턴해줍니다.

오잉?? 그럼 어떻게 1부터 45까지의 숫자를 얻는다는 걸까요??

이제부터 트릭을 알려드리겠습니다.

 

Math.random()은 0보다 크거나 같고 1보다 작은 숫자를 반환해줍니다.

내가 얻고자하는 max숫자를 곱해주면

0부터 max값 사이의 double 형태의 숫자를 얻을 수 있습니다.

그럼 이 숫자를 다시 int형태로 casting을 해버리면?

0<= 원하는 숫자 < max 사이의 int 값을 얻을 수 있습니다.

 

예제를 한번 보여드리도록 하겠습니다.

public static void main(String[] args) {
  getRandomNumber();
}
	
private static void getRandomNumber() {
  final int max = 46;
  for(int i = 0; i < 10; i++) {
    int randomNumber = (int)(Math.random() * max);
    System.out.println(randomNumber);
  }
}

위 코드를 실행시키면 아래와 같은 결과를 얻을 수 있습니다.

0
12
34
27
5
21
10
24
43

위 결과에는 중복된 숫자가 나오지 않았지만

몇 번 실행하다보면 동일한 숫자가 연속으로 나오는 경우도 있습니다.

따라서 중복을 제거해주는 과정이 필요하게 됩니다.

이때 필요한 것이 바로 Set입니다.

Set은 자바에서 중복을 제거하고자 할 때 아주 유용하게 쓰이는 자료구조입니다.

Set의 구현체는 여러가지가 있는데 일반적으로 많이 쓰이는 것은 HashSet입니다.

아래 예제 코드를 한번 보겠습니다.

public static void main(String[] args) {
  removeDuplicate();
}
	
private static void removeDuplicate() {
  Set<Integer> noDuplicated = new HashSet<>();
  noDuplicated.add(30);
  noDuplicated.add(30);
  noDuplicated.add(31);
  System.out.println(noDuplicated);
}

위 코드를 실행하면 아래와 같이 출력됩니다.

[30, 31]

보시는 바와 같이 30을 두 번 add 했는데 1개만 저장이 되었습니다.

이것을 이용해서 이미 뽑은 숫자는 저장하지 않고 새로운 번호를 뽑도록 할 수 있습니다.

 

아래는 완성된 로또 번호 생성기의 샘플입니다.

private static void lotto() {
  final int min = 1;
  final int max = 45;
		
  Set<Integer> selected = new HashSet<>();
  while(true) {
    int randomNumber = (int)(Math.random() * (max - min +1) + min);
    if(selected.add(randomNumber)) {
      if(selected.size() == 6) {
        break;
      }
    }
  }
  System.out.println(selected.stream().sorted().collect(Collectors.toList()));
}

위 메서드를 main 함수에서 실행시키면

1~45까지의 숫자들 중에서 중복되지 않은 6개의 숫자를 출력해줍니다.

랜덤 번호 생성하는 부분이 조금 수정된 것을 눈치채셨나요?

저 위에서 보여드린 로직으로는 0이 나올 수 있기 때문에 수정을 한 것입니다.

자바로 랜덤 숫자 구하는 방법에 대한 자세한 내용은 랜덤 숫자 구하기 에서 확인하실 수 있습니다.

 

위 메서드를 10번 실행한 결과는 아래와 같습니다.

[5, 17, 18, 25, 29, 33]
[9, 13, 16, 26, 30, 34]
[21, 24, 27, 30, 31, 42]
[9, 15, 17, 34, 36, 42]
[2, 3, 15, 35, 38, 41]
[8, 16, 30, 31, 36, 39]
[1, 5, 11, 40, 43, 44]
[1, 3, 4, 18, 21, 39]
[4, 7, 19, 28, 38, 40]
[7, 9, 14, 18, 30, 41]

이상으로 자바로 심플한 로또 번호 자동 생성기 만들기 포스팅을 마치도록 하겠습니다.

궁금한 점이 있으시면 댓글 달아주시고,

포스팅 내용이 도움이 되셨다면 공감 꾹 부탁해요 ^-^