다음은 로또번호를 생성하는 프로그램이다.
개인적으로 로또를 사면 크게 한방을 노리기 위해 만원어치를 사는 편이다.
따라서 while(count<10)을 통해 10번의 case를 만들었다.
import java.util.Random;
public class Test {
public static void main(String[] args) {
Test ts = new Test();
ts.test();
// Random 클래스의 인스턴스를 생성
}
public void test() {
System.out.println("test");
Random rm = new Random();
int count=0;
// case 10개를 생성
while(count<10) {
// 1~45까지의 수 6개를 생성하는 코드를 작성
for(int i=0; i<7; i++) {
int rand = rm.nextInt(45)+1;
if(i==6) {
System.out.println("\n2등 보너스 당첨번호는 : " + rand + "입니다");
System.out.println();
}
else
System.out.print(rand + " ");
}
count++;
}
}
}
위와 같이 코드를 작성하면 완전한 로또번호를 생성할 수 없다.
왜냐하면 Random()함수는 같은 조건으로 반복문을 진행하기 때문에 중복을 반영하게 된다.
따라서 나왔던 번호가 또 다시 나올 수도 있다는 결함이 있다.
중복을 허용하지 않는 코드를 작성해보자
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
Test2 ts = new Test2();
ts.test2();
// Random 클래스의 인스턴스를 생성
}
public void test2() {
System.out.println("test");
Random rm = new Random();
int count = 0;
int[] rand = new int[7];
// case 10개를 생성
while (count < 10) {
// 1~45까지의 수 6개를 생성하는 코드를 작성 (+2등 당첨번호)
for (int i = 0; i < 7; i++) {
rand[i] = rm.nextInt(45) + 1;
for (int j = 0; j < i; j++) {
// rand[0] 과 rand[1] 이 같은 값이 나온다면 rand[1]을 rand[0]으로 돌려서 새로운 값 할당
if (rand[i] == rand[j]) {
i--;
break;
}
}
}
for (int i = 0; i < 7; i++) {
if (i == 6) {
System.out.println("\n2등 보너스 당첨번호는 : " + rand[i] + "입니다");
System.out.println();
} else
System.out.print(rand[i] + " ");
}
count++;
}
}
}
중복을 제거하기 위한 코드이다.
for (int i = 0; i < 7; i++) {
rand[i] = rm.nextInt(45) + 1;
for (int j = 0; j < i; j++) {
if (rand[i] == rand[j]) {
i--;
break;
}
}
}
- rand[0]에 랜덤 값을 넣는다. (i = 0)
- j = 0; j < 0 이므로 다음 i의 반복을 실행한다.
- rand[1]에 랜덤 값을 넣는다. (i = 1)
- j = 0; j < 1 이므로 j 반복을 1번 실행한다.
- 이때 rand[1] == rand[0] 이라면 (i = 1 / j = 0)
- i를 감소시키고 j 반복문을 빠져 나온다. (i = 0)
- 다시 i 반복문을 실행하려고 할때 i = 1이 되었다.
- rand[1]에 랜덤 값을 넣는다. (i = 1)
- j = 0; j < 1 이므로 j 반복을 1번 실행한다.
- rand[1] == rand[0] 조건을 만족하지 않으면 i 반복문이 실행된다.
'Java' 카테고리의 다른 글
자바 오버라이딩 개념정리 (오버라이딩 오버로딩 차이) (0) | 2022.01.05 |
---|---|
자바 상속(inheritance)의 개념 (부모클래스, 자식클래스, extends) (0) | 2022.01.05 |
자바 클래스 및 객체와 인스턴스의 구분 (0) | 2022.01.01 |
public static void main(String[] args)는 무슨 의미일까? (0) | 2022.01.01 |
public, protected, default, private 접근제한자 (0) | 2021.12.31 |
댓글