저번 시간에 가볍게 다루었던 Math.random() 메서드를 통해
가장 와닿고 재밌다고 생각되는 로또 번호 생성기 코드를 한 번 작성해 보겠습니다.

이것만이 정답은 아니고 여러가지 방법이 있겠지만 저는 배열 선언과 배열간 자리바꿈을 통한 로또 번호 생성을 했습니다.
public class lotto {
public static void main(String[] args) {
int[] ball = new int[45];
for(int i=0; i<ball.length;i++){
ball[i]=i+1; //ball[0]에는 0+1이므로 1이 저장된다. 또한 ball[44]에는 45가 저장된다.
}
int tmp = 0; //두 값을 바꾸는데 사용할 임시 변수
int j = 0; // 임의의 값을 얻어서 저장할 변수
for(int i=0; i<6; i++) {
j=(int)(Math.random()*45); //i번 인덱스와 섞을 j 번 인덱스를 랜덤하게 구한다.
//ball[i]와 ball[j] 섞기.
tmp = ball[i];
ball[i]=ball[j];
ball[j]=tmp;
}
for(int i=0 ; i<6; i++){
System.out.printf("ball[%d]=%d%n",i,ball[i]);
}
}
}
하나씩 설명해보자면,
먼저, 로또 번호의 범위인 1~45의 값을 저장하는 배열을 생성합니다.
ball[i]=i+1; //ball[0]에는 0+1이므로 1이 저장된다. 또한 ball[44]에는 45가 저장된다.
}
이제 ball[] 배열에는 1부터 45까지의 값이 저장되게 됩니다.
(i=0부터 i<ball.length 이기 때문에 0부터 44까지 반복)
우리는 1부터 45까지 값이 저장된 배열 중 앞의 6개만 배열간 자리바꿈을 통해 이용할 것 이므로
자리를 바꾸기 위한 변수 tmp, j를 선언해줍니다.
현재까지 상황을 다시 정리해보자면,
ball [ ] 은 45개의 인덱스 길이를 가진 배열이며,
ball[0]~ ball[44]에 각각 1~45 까지의 값이 순서대로 들어가 있습니다.
이제 이 순서대로 되어있는 배열을 Math.random() 함수를 사용하여 섞어줄 것 입니다.

j에 0~44까지 숫자 중 하나를 랜덤으로 담습니다. (j는 인덱스에 들어갈 숫자이므로 44까지 입니다)
그리고 반복문은 i는 0부터 5까지 총 6번 반복합니다. (로또의 숫자가 6개이기 때문)
그리고 tmp에 임시로 ball[i]의 값을 담아두고
ball[i]에는 랜덤으로 뽑은 ball[j]의 값을
다시 ball[j]에는 tmp에 임시로 담은 값을 넣어
ball[i]의 값과 ball[j]의 값을 바꾸는 과정을 6번 반복합니다.
그렇다면 반복이 끝나면 어떤 상태일까요?
ball[ ]배열의 0번부터 5번 인덱스
즉, 처음부터 6개의 인덱스에는 섞여서 랜덤한 값이 들어가 있을 것 입니다.
그러면 마지막으로 이 값들을 출력합니다.


결과화면 창 입니다. 6개의 숫자가 랜덤하게 잘 나온것을 확인 할 수 있습니다.
조금 어려운 방법을 통해서, 추출해서 헷갈릴 수 있을 것 같습니다.
마무리 정리
1. ball[ ] 배열에 1부터 45까지의 값을 차례대로 나열함
(ball[0]=1 , ball[1]=2, ball[2]=3 ~~~ ball[44]=45 )
2. 섞을 인덱스를 random함수를 통해 선정하고, 0번 인덱스부터 차례로 바꿔줌
(ex. 첫번째 반복 (i=0)에서 ranodom 함수를 통해 j=43이 나온 경우)
-> ball[0]의 값과 ball[43]의 값을 서로 바꿈. ball[0]=44 , ball[43]=0
3.이 과정을 6번 반복함.
-> ball[0]~ ball[5]까지 6개의 인덱스가 랜덤하게 섞임.
4.섞인 ball[0] ~ ball[5] 까지의 값을 출력함.
'JAVA' 카테고리의 다른 글
| Integer.ParseInt() / Math.round() / Math.random() 메서드 (JAVA) (0) | 2024.01.11 |
|---|