Java/기초 Java

[기초 자바] 중복되지 않는 랜덤숫자 쉽게 만들기

호두빵 2021. 5. 10. 19:42

앞에서 세자리 랜덤숫자를 만들기가 어려워서 각 배열의 요소 하나하나 Math.random()으로 넣어줬는데 이번에는 좀 더 쉬운 방법을 알아보겠습니다. 스위치 개념을 이용하는 것입니다. boolean swit[]배열을 만들어줍니다. 크기는 45로 잡아봤어요, 왜냐면 로또라는게 45개 중에 6개만 맞추면 인생 대박나는 거잖아요(말처럼 쉽지 않지만) 즉 swit[] 배열은 0이나 1로 이뤄진 45개의 요소를 가지게 됩니다. 로또 5000원 어치만 사볼께요, 그러면 6개씩 5줄이 뽑힌 종이 한 장이 나올겁니다. 그런데 이 종이 안에 단 하나의 숫자도 중복이 없었으면 좋겠습니다. 그래서 int lotto[] = new int[30]을 함께 만들어줬어요. 이 안에는 30개의 정수가 들어갈 수 있겠네요. 

30개의 숫자를 뽑아내야하므로 이번에는 w가 0일때부터 while(w<30)으로 하겠습니다. 임의의 숫자 r은 Math.random()에 45를 곱한 값을 정수형으로 만들어줘요. 원래는 0<=Math.random()<1이잖아요, 그래서 45를 곱해주면 (0*45)<=Math.random()<45가 되겠죠? 그러면 여기서 0과 45 사이의 숫자라면 0이 나올수도 있고 45는 정작 안 나오는 상황이 생기는 것 아니냐 하는 의문이 들것입니다. 그러나 이 부분은 뒷부분에서 조정해줄거에요. 

 

일단 r을 만드는 것까지 완성했으니 이제 실제로 중복을 없애는 작업을 진행해야 할 것입니다. swit[r]이 false이면, 이라는 if 조건절을 확인할 수 있습니다. boolean 배열의 모든 요소의 초기값은 false입니다. 그러니 swit[r]은 r이 어떠한 값이 되더라도 false일것입니다. 그러한 r을 우리가 true로 바꿔줘서 false인 놈들과 차별화를 시켜주는 것입니다. 건들지 못하도록요. 그 후에 lotto[0] 즉 제일 처음으로 실행한 부분에는 r+1이 들어가야 할 것입니다. 0은 나오지 않고, 45는 나올 수 있도록 하는 것입니다. 

 

이렇게 30번을 다 거친 다음 lotto의 길이에 맞게 출력을 해줘야겠습니다. if((i+1)%6==0) 을 보면 i+1의 값을 6으로 나눈 것이 0일때, 즉 i+1이 6의 배수일때마다 줄을 바꿔서(println) 출력해주라는 명령입니다. 

 

그러면 lotto 배열의 

[0] [1] [2] [3] [4] [5] 이렇게 6개가 차고나면 그 다음줄로 넘어가서

[6] [7] [8] [9] [10] [11] 이렇게 되고 쭉쭉쭉 내려가서

..............

[19] [20] [21] [22] [23] [24]

[25] [26] [27] [28] [29] [30] 까지 짜잔 완성할 수 있게 됩니다~