<배열로 배열의 요소에 저장된 값 섞기>


배열의 요소의 순서를 반복해서 바꾼다.
(카드 섞기, 로또번호 생성 등을 할 수 있다.)

 

 

 

배열의 요소에 저장된 값을

인덱스 순서에 상관없이

무작위로 섞어야 할 경우

앞서 배운 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개의 번호가

중복이 되면 안되기 때문에

반드시 교환하는 방법으로 섞어야 함을 명시하자.