<배열로 배열의 요소에 저장된 값 섞기>
배열의 요소의 순서를 반복해서 바꾼다.
(카드 섞기, 로또번호 생성 등을 할 수 있다.)
배열의 요소에 저장된 값을
인덱스 순서에 상관없이
무작위로 섞어야 할 경우
앞서 배운 Math.random()과 for문을 이용하면
간단하게 섞을 수 있다.
int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]); // 0123456789
}
for (int i = 0; i < 100; i++) { // 100회의 shuffle
int n = (int)(Math.random() * 10); // 0~9사이의 임의의 수
int tmp = arr[0];
arr[0] = arr[n];
arr[n] = tmp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]); // 2910863745
}
위 예제에서는 Math.random()으로 반환된 임의의 값을
인덱스 값으로 이용하고,
변수의 값을 교환했을 때처럼
임의 변수 tmp를 이용하여,
arr[0]에 저장된 값과 arr[n]의 저장된 값을 바꾸었고
이를 for문으로 100회 반복해
무작위로 배열의 요소 순서를 바꾸었다.
위 예제처럼 섞기 전 배열 요소 간의
같은 값이 없는 경우,
교환하는 방식으로 섞었기 때문에
중복된 값은 나올 수 없다.
<로또 번호 생성기>
전 세계적으로 시행하고 있는 대표적인 복권으로
보통 n개의 번호 중 순서 구분 없이
k개의 번호를 뽑아 맞은 번호의 수에 따라
당첨금을 지급하는 방식으로 진행된다.
우리나라에서는 현재 45개의 번호 중
순서 구분 없이 6개의 번호라 일치하면
1등 당첨금을 지급하고 있다.
배열과 반복문, Math.random()을 이용하여
로또 번호 생성기를 만들어 보자.
int[] ball = new int[45]; // 45개의 정수값을 저장하기 위한 배열 생성
for (int i = 0; i < ball.length; i++) // 배열의 각 요소에 1~45의값을 저장한다.
ball[i] = i+1; // 0은 없으므로 ball[0]에 1이 저장된다.
int temp = 0; // 두 값을 바꾸는데 사용할 임시변수
int j = 0; // 임의의 값을 얻어서 저장할 변수
// 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 섞는다.
// 0번째부터 5번째 요소까지 모두 6개만 바꾼다.
for (int i = 0; i < 6; i++) {
j = (int)(Math.random() * 45); // 0~44범위의 임의의 값을 얻는다.
temp = ball[i];
ball[i] = ball[j];
ball[j] = temp;
}
// 배열 ball의 앞에서 부터 6개의 요소를 출력한다.
for (int i = 0; i < 6; i++) {
System.out.printf("ball[%d]=%d%n", i, ball[i]);
}
길이가 45인 배열에
1~45까지 값을 담은 후
이를 무작위로 섞어
앞의 6자리만 출력하는 식으로 만들었다.
이는 1부터 45까지의 번호가 쓰인 카드를
잘 섞은 뒤 맨 위의 6장을 꺼내는 것과 같다고 할 수 있다.
45개의 번호 중 뽑은 6개의 번호가
중복이 되면 안되기 때문에
반드시 교환하는 방법으로 섞어야 함을 명시하자.
'. Java의 정석' 카테고리의 다른 글
[Java] 배열의 활용 : 정렬하기 - 버블정렬 (bubble sort) (0) | 2021.07.14 |
---|---|
[Java] 배열의 활용 : 정렬하기(sort) (0) | 2021.07.14 |
[Java] 배열의 활용 : 임의의 값으로 배열 채우기(Math.random()) (0) | 2021.07.14 |
[Java] 배열의 활용 : 최대값(max)과 최소값(min) (0) | 2021.07.13 |
[Java] 배열의 활용 : 총합(sum)과 평균(average, avg) (0) | 2021.07.13 |