MSM8994의 화룡점정 블로그

[JAVA] Math.random()을 활용한 중복이 없는 임의의 수 6개짜리 배열에 담기 본문

코딩

[JAVA] Math.random()을 활용한 중복이 없는 임의의 수 6개짜리 배열에 담기

msm8994 2018. 7. 24. 16:30

배열을 만들고 이 배열의 길이만큼 임의의 수를 넣으려고 합니다.
로또처럼 1~45 사이의 수로 하려면 이렇게 하세요. Math.random()을 활용하되 0.0~0.99999... 까지밖에 안되는 값에 최대값을 곱해서 0~44.99999... 로 만들어주세요. 여기에 1을 더해 1~45.99999로 만들고 int형으로 변환하면 1~45까지의 임의의 수가 나옵니다.
로또에는 같은 숫자가 다시 뽑혀나오지 않으므로 직접 중복여부를 검사해서 중복인 경우 해당 칸을 다시 반복하도록 합니다.


int[] numbers = new int[6]; // 6개의 정수를 담는 배열 선언

// insertCur가 numbers 배열의 길이를 넘지 않을 때까지 반복합니다.
// 중복이 생긴다면 반복 횟수가 늘어날 수 있습니다.
for(int insertCur = 0; insertCur < numbers.length ; insertCur++){
    // 1. 임의의 수 삽입
    // Math.random()이 제공하는 0.0~0.999...의 수에 45를 곱해
    // 0.0~44.xx의 수를 만들고 이를 정수로 바꾼다.
    // 여기에 1을 더해서 1~45가 되도록 한다.
    numbers[insertCur] = (int)(Math.random() * 45) + 1;

    // 2. 중복 검사
    // 배열의 기존 원소(insertCur 이전까지)를
    // 방금 삽입한 수와 비교해 같은 수가 있다면 insertCur를 앞으로 밀어
    // 다음 반복에서 같은 칸에 다른 수를 쓰도록 합니다.
    for(int searchCur = 0; searchCur < insertCur; searchCur ++){
        if(numbers[insertCur] == numbers[searchCur]){
            insertCur--; // insertCur를 앞으로 민다
            break; // 다음 것을 검색할 필요가 없으므로 중복검사 반복을 나갑니다.
        }
    }
}

// 3. 출력하기
System.out.println("행운의 번호는 아래와 같습니다:");
for(int i = 0; i < numbers.length; i ++){
    if(i > 0){
        // 맨 처음 원소가 아니라면 앞에 ", "문자열 추가
        // 1, 2, 3, ..., 6 꼴로 나오게 함
        System.out.print(", ");
    }
    System.out.print(numbers[i]);
}


결과



더 쉽게 코딩하고 싶다면

HashSet을 활용해보세요. HashSet은 같은 값은 하나씩만 담기므로(중복이 허용되지 않음) 계속 값을 담으며 전체적으로 몇 개가 담겼는지만 확인하시면 됩니다. 

// Integer 정수 객체를 담는 HashSet
// HashSet은 중복을 거부하는 Set 입니다.
// 중복이 들어오면 이는 무시되어 같은 수는 하나만 담기게 됩니다.
HashSet<integer> luckyNumbers = new HashSet<>();

// 이 HashSet에 수가 6개 채워질 때 까지 반복합니다.
// 중복 처리가 자동으로 이루어지므로 삽입만 하면 됩니다.
// 하지만 중복된 수는 삽입이 거부되므로 반복 횟수가 늘어날 수 있습니다.
while(luckyNumbers.size() < 6){
    // 1. 임의의 수 삽입
    // Math.random()이 제공하는 0.0~0.999...의 수에 45를 곱해
    // 0.0~44.xx의 수를 만들고 이를 정수로 바꾼다.
    // 여기에 1을 더해서 1~45가 되도록 한다.
    luckyNumbers.add((int)(Math.random() * 45) + 1);
}

// 2. 출력하기
System.out.println("행운의 번호는 아래와 같습니다:");
boolean isFirstNum = true; // 맨 처음에 기재되는 번호인지를 파악하는 플래그
// luckyNumbers 각 원소를 읽기전용으로 하나씩 꺼내기
for(int luckyNum : luckyNumbers){
    if(isFirstNum){
        isFirstNum = false; // 맨 처음에는 ", " 문자열을 추가하지 않고 플래그를 내립니다.
    } else {
        // 맨 처음 원소가 아니므로 앞에 ", "문자열 추가
        // 1, 2, 3, ..., 6 꼴로 나오게 함
        System.out.print(", ");
    }
    System.out.print(luckyNum);
}
Comments