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로 바꿔서 한 번 해봤더니 메모리는 좀 늘어났지만 출력하는 속도는 눈에 보일 정도로 빨라졌다.