Notice
Recent Posts
Recent Comments
Link
MSM8994의 화룡점정 블로그
[JAVA] Math.random()을 활용한 중복이 없는 임의의 수 6개짜리 배열에 담기 본문
배열을 만들고 이 배열의 길이만큼 임의의 수를 넣으려고 합니다.
로또처럼 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); }
'코딩' 카테고리의 다른 글
[JS] 구구단 퀴즈 (Form 사용) (0) | 2018.07.26 |
---|---|
[JS] 사칙연산 계산 (Form, 함수 사용) (0) | 2018.07.25 |
[JAVA] Calendar 객체와 SimpleDateFormat으로 얻은 날짜 문자열을 비교하기 (0) | 2018.07.23 |
[C#] Getter와 Setter를 손쉽게! 속성을 써보자 (0) | 2018.07.20 |
[JAVA] 멤버 변수를 보호해주는 Getter와 Setter (0) | 2018.07.20 |
Comments