public class Lotto { public static void main(String[] args) { int[] lotto = new int[6]; for(int i = 0 ; i<lotto.length;i++){ lotto[i]=createNum(i,lotto)+1; } System.out.println(); for(int i = 0 ; i < lotto.length;i++){ System.out.print(lotto[i]+" "); } } private static int createNum(int i, int[] lotto) { boolean flag ; int tmp=0; do{ flag = false; tmp = (int)(Math.random()*45); for(int index = 0 ; index< i ;index++){ if(lotto[index] == tmp) flag = true; } }while(flag); return tmp; } }
안녕하세요 자바 걸음마 수준의 학생입니다.
다름이 아니라 아래와 같이 로또 번호 생성기를 만들었는데
메소드로 중복처리를 했는데도 불구 하고 계속 중복 번호가 생성되서
질문드립니다.
ㅜㅜ 뭐가 문제인지 모르겠네요
==================================================
배열에 들어가는 값은 createNum의 반환값의 +1 이구요(1~45)
함수에서 비교하는 값은 +1이 안된 값이라서 그렇지요(0~44)
random에서 뽑을때 바로 +1을 해주세요
createNum에서 중복 처리를 하다 마셨는데요. 제 코드가 절대 정답은 아닙니다만, 참고라도 되셨으면 좋겠습니다.
public void testGenerateNumbers(){
for (int i=0; i<6; i++){
lotto[i] = getnerateNumber();
System.out.print("\t" + lotto[i]);
}
}
private int getnerateNumber(){
int genNum = -1;
do {
genNum = (int)(Math.random()*45)+1;
} while (isExists(genNum));
return genNum;
}
private boolean isExists(int num){
for (int lottoNum : lotto){
if (lottoNum == num ) {
return true;
}
}
return false;
}
이왕이면 중복 체크하는 메소드는 별도로 빼주시는 것이 이해하기가 더 가독성이 있을 듯하구요.
+1을 createNum 에서 return할 때 해 주세요. 일관성 있게..
if
(lotto[index] == tmp) flag =
true
;
이 부분은 if
(lotto[index] == tmp) {flag =
true
; break;} 로.. (속도 향상)
HashSet을 이용한 구현.. 참고해 보세요..
import java.util.HashSet;
public class Lotto {
public static void main(String[] args) {
HashSet<Integer> lotto = lottoNums();
for (int x : lotto) {
System.out.print(x + " ");
}
}
public static HashSet<Integer> lottoNums() {
HashSet<Integer> r = new HashSet<Integer>();
while (r.size() < 6) r.add((int) (Math.random() * 45 + 1));
return r;
}
}
중복을 없애려면 map종류를 사용하시면 됩니다. 키값이 존재하면 업데이트 되고 없으면 새로 추가 됩니다.