Java/끄적임
로또 뽑기 프로그램은 어떤 숫자가 많이 나올까?
ehdghk154
2022. 2. 11. 22:16
내일 토요일, 어머니가 나가는 김에 로또를 사러 간다길래 갑자기 호기심이 생겼다.
그래서 프로그램 하나 만들어보기로 했고, 그냥 숫자 6개 뽑기는 식상해서 다르게 만들어보고 싶어 한 번 심심풀이 겸 재미로 만들어보았다.
조건(?) 과정(?)
1. 6개의 번호를 뽑는 것을 일정 횟수만큼 반복한다. (이번 프로그램 테스트는 횟수를 10번으로 했다. 중복있는 60개 숫자)
2. 반복하여 나온 숫자들 외의 숫자들을 모두 제외시킨다.
3. 이 방식을 일정 횟수만큼 반복한다.(이번 테스트에서는 1만번으로 설정했다.)
코드
public class LottoProgram {
static int[] lotto, check;
public static void main(String[] args) {
lotto = new int[46]; // 로또 숫자
check = new int[46]; // 로또 숫자 나온 횟수 체크용
int[] result = new int[6]; // 로또는 6개 번호
int secondCycle = 10000; // 제외를 위한 전체 반복 횟수
int firstCycle = 10; // 제외 전 로또 숫자 6개 뽑기 반복 횟수
// 6(k)개의 로또 번호를 firstCycle(j)번 반복하여 뽑은 방법을 secondCycle번(i) 반복
for(int i = 1; i <= secondCycle; i++) {
for(int j = 0; j < firstCycle; j++) {
for(int k = 0; k < result.length; k++) {
result[k] = (int)(Math.random()*45)+1;
// 이미 빠진 숫자나 앞에서 나온 숫자는 제외
if(k == 0) {
// 아래 else의 for문으로는 0일 때를 체크하지 않으므로 따로 체크
if(lotto[result[k]] == -1) {
k--;
}
}else {
// 이미 i번 반복에서 제외된 숫자거나 k번 반복에서 나온 숫자일 경우 재추첨
for(int l = 0; l < k; l++) {
if(lotto[result[k]] == -1 || result[k] == result[l]) {
k--;
break;
}
}
}
}
// 뽑은 로또 숫자 체크하기
for(int k = 0; k < result.length; k++) {
lotto[result[k]]++;
check[result[k]]++;
}
}
// firstCycle번 반복하여 나온 결과 체크
for(int j = 1; j < lotto.length; j++) {
// 반복에서 나오지 않은 숫자를 제외하기 위해 -1 입력
if(lotto[j] <= 0)
lotto[j] = -1;
// 반복해서 나온 숫자는 화면에 출력 후 횟수 초기화
else if(lotto[j] > 0){
System.out.println(j + "번");
lotto[j] = 0;
}
}
System.out.println(i + "번째 추첨 완료");
System.out.println("-------------------------------------------------");
}
// 끝날 때 숫자별로 나온 횟수를 화면에 출력
for(int i = 1; i < check.length; i++) {
System.out.println(i + "번: " + check[i]);
}
}
}
내일 가신다고 해서 급하게 한 번 만들어 본 프로그램이라 깨끗한 코드는 아닌거 같고... 이제 막 졸업이라 그런가 클린코드라는걸 제대로 본 적이 없어서 그런 것 같기도 하고...
몇 번 돌려본 결과 secondCycle이 1만 번일 때는 대부분 8개의 숫자가 나왔고(6개 숫자를 10번 반복해서 제외한 방식을 1만번 반복),
6만 번에서 7만 번으로 갈 때 쯤 7개의 숫자가 나왔다.
그리고 코드를 다 작성하고,print문을 StringBuilder로 바꿔서 한 번 해봤더니 메모리는 좀 늘어났지만 출력하는 속도는 눈에 보일 정도로 빨라졌다.