배열 1, 2, 3, 4 ...에서 랜덤 숫자 배열 추출 예제
★프로그래밍/Ruby :: 2015. 9. 13. 23:04Ruby의 배열 기능 중 정렬 기능과 섞기 기능을 활용한 예제입니다.
마치 로또복권처럼 1부터 45까지 45개의 숫자가 들어 있는 배열을 무작위로 섞은 후 그 배열에서 6개의 숫자를 추출해 배열을 만들고 출력할 때 보기 좋게 하기 위해 랜덤으로 선택된 6개의 숫자가 있는 배열을 오름차순으로 정렬하는 예제입니다.
다음은 이를 구현한 코드입니다.
n_max = 45 #전체 숫자 수 n_sel = 6 #고를 숫자 수 n_times = 5 #고를 횟수 d = [] for i in 1..n_max d.push i #숫자를 1부터 차례대로 넣기. end for i in 1..n_times #고를 횟수만큼 반복 d.shuffle! #숫자 섞기. nn = n_sel - 1 #고를 숫자 수에서 1 빼기. d_sel = d[0..nn] #고를 숫자 수만큼 배열을 추출. d_sel.sort! #고른 숫자 집합을 정렬. print "추첨 결과: " for j in 0..nn #고른 숫자 수만큼 출력 (폭을 동일하게) print sprintf("%2d ", d_sel[j]) end puts #줄바꿈 end
이 코드의 알고리즘을 설명하자면 다음과 같습니다.
- 1행~3행: 먼저, 전체 숫자 집합 수(여기서는 45개)와 그 중 고를 숫자 수(여기서는 6개), 랜덤으로 숫자 조합을 고를 횟수(여기서는 5개)를 미리 선언합니다.
- 4행: 전체 숫자 집합을 넣을 배열을 미리 설정해 둡니다.
- 6행~8행 1부터 전체 숫자 집합 수까지 하나씩 전체 숫자 집합 배열에 삽입합니다.
- 10행~24행: 랜덤으로 고를 횟수만큼 반복합니다.
-- 11행: 전체 숫자 집합을 무작위로 섞습니다.
-- 13행~14행: 배열의 처음은 0이므로 고를 숫자 수에서 1을 뺀 수를 임시 변수로 설정하고 전체 숫자가 있는 배열에서 0번부터 그 임시 변수 값 번호까지의 숫자를 선택된 숫자 집합 배열에 넣습니다. 전체 숫자 배열은 11행에서 이미 섞여 있으므로 선택된 숫자 집합 배열에 들어갈 수는 랜덤입니다.
-- 16행: 보기 좋게 하기 위해 선택된 숫자 배열을 정렬합니다.
-- 18행: 화면에 '추첨 결과: '라는 텍스트를 표시합니다. 그 뒤에 숫자가 바로 표시되게 하기 위하여 행갈이를 하지 않습니다.
-- 19행~22행: 선택된 숫자 집합 배열의 숫자들을 그 수만큼 표시합니다. 배열 번호가 0부터 시작되어 배열 마지막 번호는 원소 개수보다 1 작기 때문에 13행의 임시 변수를 활용합니다. sprintf문을 이용하여 보기 좋도록 숫자가 가지런하게 배치되는 서식을 지정합니다.
-- 23행: 다음 추첨을 위해 행갈이를 합니다.
이런 구조입니다. 유용하게 활용하시기 바랍니다.