자바 로또 번호 생성 - jaba lotto beonho saengseong

  • 문제
    for문과 Math.random() 메소드를 사용하여 중복없는 로또 번호를 생성하는 프로그램을 만들어봐라.

  • 자바 로또 번호 생성 - jaba lotto beonho saengseong
  • 실행결과
    자바 로또 번호 생성 - jaba lotto beonho saengseong
  • 풀이

public class Lotto {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int lotto[] = new int[6];	// 로또 번호를 입력받을 배열을 선언해준다.
		
		System.out.print("로또 번호 : ");
		for(int i = 0; i < lotto.length; i++) {
			int num = (int)(Math.random() * 45) + 1;	// 1~46까지의 임의의 수를 받는다.
			lotto[i] = num;
			for(int j = 0; j < i; j++) {	// 중복된 번호가 있으면 이전 포문으로 돌아가 다시 시행한다.
				if(lotto[i] == lotto[j]) {
					i--;
					break;
				}
			}
			System.out.print(lotto[i] + " ");	// 로또번호를 출력한다.
		}

	}
}
		

  • 자바 로또 프로그램 만들기

자바 배열을 이용하여 아래와 같이 간단한 로또 프로그램을 제작할 수 있습니다.

package date20200317;


public class Array_lotto {
	public static void main(String[] args) {
		int lotto[] = new int [6];
		
     	  	// 번호 생성
		for(int i=0; i<6; i++) {
			lotto[i] = (int)(Math.random() * 45) + 1;
            
       		  	 // 중복 번호 제거
			for(int j=0; j<i; j++) {
				if(lotto[i] == lotto[j]) {
					i--;
					break;
				}
			}
		}
	System.out.print("로또 번호: ");
	
  	 // 번호 출력
	for(int i=0; i<6; i++) {
		System.out.print(lotto[i] + " ");
	}	
	}
}


// 출력 결과 : "로또 번호: 1 19 17 38 33 31"

문제 ) 로또 번호 자동 생성기 프로그램을 작성하세요

단, 중복 값이 있으면 안됨

(Hint : Random Class 사용)

문제가 중복값이 있으면 안된다고 했다...흠...그건 어떻게 하지..

랜덤 함수를 쓰려고 했는데

범위가 0부터 시작이라서 사용을 못했다. 랜덤함수를 이용해서 어떻게 하지?

*랜덤함수 쓰려면

import java.util.Random;

Random 변수 = new Random();

//랜덤클래스 객체 생성

int num=변수.nextInt(10); //0~9까지 랜덤수생성.

*참고로 랜덤클래스 메소드중에

nextInt() : 정수형 랜덤

nextDouble() : 실수형 랜덤

nextBoolean() : 참, 거짓 랜덤

자바 로또 번호 생성 - jaba lotto beonho saengseong

중복체크 함(완성본)

자바 로또 번호 생성 - jaba lotto beonho saengseong

중복체크함(완성 출력화면)

<랜덤 입력값 중복체크 부분>

for(int i=0; i<arr.length;i++) {

arr[i] = (int)(Math.random()*45)+1;

for(int j=0; j<i;j++) {

if(arr[i]==arr[j]) {

i--;

}

}

}

소스코드 중

위의 부분은 중복체크 부분이다.

도저히 모르겠어서 구글링해서 소스코드를 찾았다.

처음 이중for문을 보고 이중배열도 아닌데 엥? 했는데 규칙을 생각해 보니 맞는것같다.

규칙이

만약 입력할 숫자가 총 4개라고 가정하면

i=0,i=1,i=2, i=3 이다.

i=0 -> 비교할 필요 없음

i=1 -> i=1 VS i=0비교 해야함

i=2 -> i=2 VS i=0, i=2 VS i=1비교필요

i=3 -> i=3 VS i=0, i=3 VS i=1, i=3 VS i=2 비교 필요

자바 로또 번호 생성 - jaba lotto beonho saengseong

빨간부분이 1씩 증가하는 동안 -> for문1개

노란부분이 비교되므로 -> for문1개

둘을 비교하는걸 이중 for문으로 만들면 되겠다라는 생각이 들었다.

투케이2K

Java

31. (java/자바) lotto 로또 프로그램 (랜덤 번호 생성 및 당첨 확인) - Random(임의)정수값 생성, while(true)로또 번호 저장, for문 당첨 확인

투케이2K 2020. 12. 30. 08:04

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java

자바 로또 번호 생성 - jaba lotto beonho saengseong

/* =========================== */

/* =========================== */

[소스 코드]

package Al;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class MainActivity9 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("[lotto 로또 프로그램 (랜덤 번호 생성 및 당첨 확인) - Random(임의)정수값 생성, while(true)로또 번호 저장, for문 당첨 확인 실시]");
		/*[설 명]
		 * 1. 로또 번호는 총 6개 번호를 지정한다
		 * 2. 6개 일치 : 1등 / 5개 일치 : 2등 / 4개 일치 : 3등 / 그외 : 꽝 으로 정한다
		 * 3. Random 객체를 사용해서 난수 랜덤 정수값을 생성한다 (1 ~ 45 정수 까지 범위 지정)
		 * 4. while(true) 사용해서 중복없는 랜덤 정수값 배열에 저장합니다
		 * 5. for 문을 사용해서 두배열 일치 값 개수를 확인하고 등수를 출력합니다
		 * 6. 참고 사항 - 일반적으로 이중 for문을 사용해 간편히 랜덤 로또 번호를 저장할 수 있으나,
		 *             while 문을 사용해서 작성해 보았습니다
		 */
		
		//로또 당첨 정답 번호 배열입니다 (총 6개 정답번호가 저장되어있습니다)
		int lotto[] = {3, 5, 24, 32, 10, 9};
		System.out.println("로또 당첨 번호 : "+Arrays.toString(lotto));
		
		//랜덤 정수값을 생성하기 위해 Random 객체를 생성해줍니다
		Random random = new Random();
		
		//random 랜던 정수값을 담을 배열을 선언해줍니다
		int number[] = new int[6];
		Arrays.fill(number, 0); //배열에 초기 전체 데이터 0을 모두 대입시켜줍니다
		
		int idx = 0; //배열 번지 번호를 지정하기 위한 인덱스 변수값 생성
		while(true) { 
			int zero = 0; //0이 아닌값이 정상적으로 모두 저장된것인지 확인 위해 변수 선언
			for(int i=0; i<number.length; i++) {
				if(number[i] == 0) { //배열 각 번지를 전체 확인 하면서 0 값이 있을 경우 zero 값을 증가시킴니다
					zero ++;
				}
			}
			//zero 변수값이 카운트된게 없을 경우 정상적으로 값이 모두 대입된 것을 확인
			if(zero <= 0) {				
				break; //while 무한 루프를 탈출합니다				
			}			
			else { //배열에 랜덤 정수값을 다 저장하지 않은 경우 수행합니다	
				//랜덤 정수값 1부터 45범위까지 임의 정수를 저장합니다
				int random_number = random.nextInt(45)+1;
				
				//배열에 랜덤으로 생성된 값이 이미 저장되어 있으면 중복저장하지 않기위해 검사를 실시합니다
				int check = 0;
				for(int k=0; k<number.length; k++) {
					if(number[k] == random_number) {
						check ++; //배열 각 번지를 전체 확인 하면서 일치하는 정수값이 있을 경우 check 값을 증가시킴니다
					}
				}
				
				//이미 저장된 값이 없을 경우 배열에 데이터를 저장시킵니다
				if(check <= 0) {
					number[idx] = random_number;
					idx ++; //저장을 수행하기 위한 배열 번지값을 증가시킨 후 다시 while문을 반복합니다
				}				
			}
		}//while 문 종료
		
		System.out.println("사용자 로또 번호 : "+Arrays.toString(number));
		
		int count = 0;
		for(int j=0; j<lotto.length; j++) { //로또 정답 배열
			for(int h=0; h<number.length; h++) { //사용자 로또 번호 배열
				if(lotto[j] == number[h]) { 
					count ++; //사용자 로또 배열 값이 로또 정답 배열 값이랑 같은게 있을 경우 count 증가
				}
			}
		}
		
		System.out.println("맞힌 개수 : "+count);
		
		if(count == 6) {
			System.out.println("등수 : "+"1등 입니다");	
		}
		else if(count == 5) {
			System.out.println("등수 : "+"2등 입니다");
		}
		else if(count == 4) {
			System.out.println("등수 : "+"3등 입니다");
		}
		else {
			System.out.println("등수 : "+"꽝 ... 입니다");
		}

	}//메인 종료

}//클래스 종료

/* =========================== */

[결과 출력]

[lotto 로또 프로그램 (랜덤 번호 생성 및 당첨 확인) - Random(임의)정수값 생성, while(true)로또 번호 저장, for문 당첨 확인 실시]

로또 당첨 번호 : [3, 5, 24, 32, 10, 9]

사용자 로또 번호 : [6, 3, 34, 10, 30, 45]

맞힌 개수 : 2

등수 : 꽝 ... 입니다

/* =========================== */

/* =========================== */

[요약 설명]

* 1. 로또 번호는 총 6개 번호를 지정한다

* 2. 6개 일치 : 1등 / 5개 일치 : 2등 / 4개 일치 : 3등 / 그외 : 꽝 으로 정한다

* 3. Random 객체를 사용해서 난수 랜덤 정수값을 생성한다 (1 ~ 45 정수 까지 범위 지정)

* 4. while(true) 사용해서 중복없는 랜덤 정수값 배열에 저장합니다

* 5. for 문을 사용해서 두배열 일치 값 개수를 확인하고 등수를 출력합니다

* 6. 참고 사항 - 일반적으로 이중 for문을 사용해 간편히 랜덤 로또 번호를 저장할 수 있으나,

                     while 문을 사용해서 작성해 보았습니다

/* =========================== */