Recent Posts
Recent Comments
Archives
반응형
250x250
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Yesterday

Total
05-16 20:31
관리 메뉴

Hey Tech

[Java] 임의의 정수 데이터 생성하기! (Random 모듈 활용) 본문

SW 개발/Java

[Java] 임의의 정수 데이터 생성하기! (Random 모듈 활용)

Tony Park 2021. 11. 14. 21:52
728x90
반응형

오늘은 Java에서 Random 모듈을 활용해 임의의 정수를 생성하는 방법을 공유합니다.

그럼 바로 시작하죠!

💡 학습 목표

Random 모듈을 활용해 임의의 정수를 추출하는 방법에 대해 이해한다.

기본 실습코드

Random 모듈 import

import java.util.Random;

Random 모듈을 import 해줍니다.

Random 객체 생성 및 모듈 import 단축키

public class Hello{
	  public static void main(String [] args){
	    Random rn  = new Random();
	    
	}
}

이제 Random 객체를 생성해 줍니다.

앞서 Random 모듈을 import 할 때 일일이 코드를 입력하는 방법도 있지만,

간편한 자동완성 단축키도 있습니다.

코드 입력창에 Random만 입력한 후에 ctrl + space bar를 눌러주시면

아래와 같이 자동완성 템플릿 종류가 나타납니다.

이 중에서 가장 상 단에 잇는 java.util 내에 있는 Random 모듈을 클릭해 주시면

앞서 Random 모듈 import 코드가 자동으로 코드 입력창 상단에 작성이 됩니다.

즉, 필요한 모듈의 import 코드는 이러한 단축키를 활용해서 그때그때 편리하게 작성할 수 있습니다.

임의의 정수 추출하기

public class Hello{
	  public static void main(String [] args){
	    Random rn  = new Random();
	    int r = rn.nextInt(10);
	    System.out.println(r);
	}
}

이제 0부터 10 사이 임의의 정수를 추출하고 출력해 보겠습니다.

Random 객체 내 nextInt(N) 메서드는 0부터 N 사이의 임의의 정수를 반환합니다.

특히, N은 반환하는 구간에 미포함이므로 정수 반환 구간은 [0, N)으로 표현할 수 있겠죠.

특정 구간 내 임의의 정수 추출하기

nextInt() 메서드의 반환 구간은 0부터 시작합니다.

그렇다면, 5부터 10 사이의 정수를 추출하고 싶다면 어떻게 해야 할까요?

메서드 변형 없이, 반환구간이 0부터 N이라는 점을 고려하여 코드 일부를 수정하여 구현할 수 있습니다.

아래와 같이 말이죠.

public class Hello{
	  public static void main(String [] args){
	    Random rn  = new Random();
	    int r = rn.nextInt(5) + 5;
	    System.out.println(r);
	}
}

어떤 차이인지 눈치채셨나요?

nextInt(N) 메서드 반환값의 최솟값은 0입니다.

하지만, 우리는 임의의 정수가 최소 5 이상이길 바랍니다.

따라서 nextInt() 메서드 뒤에 최솟값인 5를 추가로 더해줍니다.

 

마찬가지로, nextInt(N) 메서드 반환값의 최댓값은 (N-1)입니다.

우리는 임의의 정수가 최대 10 미만이길 바라기 때문에,

전달 인자 N의 값을 최솟값 5를 고려해 5로 수정하면 됩니다.

응용예제

Random 모듈을 활용한 2가지 예제를 함께 풀어보겠습니다.

응용 예제1

🚩 문제

첫 번째 응용 예제로서,

5부터 20 사이 임의의 정수 10개를 추출하고 출력하는 프로그램을 작성해 보겠습니다.

✔️ 정답 코드

public class Hello{
	  public static void main(String [] args){
	    for (int i = 0; i < 10; i++) {
	    	int r = new Random().nextInt(15) + 5;
		    System.out.println(r);
		}
	}
}

반복 횟수를 알고 있기 때문에 for 반복문을 사용하는 것이 효과적입니다.

클린 코드를 위한 for 반복문 작성 Tip을 이전 포스팅에서 다뤘으니 관심 있으시다면 이 글을 참고해 주세요.

Random 객체는 일회성으로만 사용한다면 따로 변수를 할당할 필요 없이,

위 코드와 같이 객체 생성과 동시에 메서드를(i.e., nextInt()) 불러와도 괜찮습니다.

응용 예제2

🚩 문제

2번째 응용 예제로,

정수 0 또는 1을 20개를 추출했을 때,

0과 1 각각이 연속으로 추출되는 최대 개수를 출력하는 프로그램을 작성해 보겠습니다.

✔️ 정답 코드

public class Hello {
	public static void main(String[] args) {
		int zeroCnt = 0, oneCnt = 0;
		int zeroMax = 0, oneMax = 0;
		Random rn = new Random();
		for (int i = 0; i < 20; i ++) {
			int r = rn.nextInt(2);
			System.out.printf("%d ", r);
			if (r == 0) {
				zeroCnt++;
				oneCnt = 0;
				zeroMax = Math.max(zeroCnt, zeroMax);
			} else {
				oneCnt++;
				zeroCnt = 0;
				oneMax = Math.max(oneCnt, oneMax);
			}
		} 
		System.out.println();
		System.out.printf("zeroMax: %d\noneMax: %d", zeroMax, oneMax);
	}
}

출력 예시

1 0 1 0 0 1 1 0 0 1 
zeroMax: 2
oneMax: 2

0과 1 각각이 연속으로 등장한 횟수를 카운팅 하기 위한 변수와(zeroCnt, oneCnt),

각 숫자가 연속으로 등장한 최대 횟수를 저장하기 위한 변수를(zeroMax, oneMax) 선언하였습니다.

Random 객체를 생성하고 nextInt() 메서드에 2를 전달하여 0 또는 1이 추출되도록 코드를 작성하였습니다.

 

그리고 if~else 구문을 활용하여 추출된 값이 0인지, 1인지에 따라 로직을 나누어 설계하였습니다.

만약 0이 추출되었다면 0이 등장한 횟수를 증가시키고 1이 등장한 횟수는 0으로 초기화합니다.

그리고 0이 연속으로 추출된 횟수의 최댓값과 비교하여 최대 연속 추출횟수를 초기화합니다.

이때 두 변수 값 중 최댓값을 찾기 위해 if ~ else 조건문을 사용할 수도 있지만,

Math 모듈에 max 메서드를 활용하면 코드를 더욱 간결하게 작성할 수 있습니다.

1이 추출되었을 때에도 위의 로직과 마찬가지 방식으로 동작하도록 설계합니다.

 

지정된 반복 횟수를 모두 수행했다면 0과 1 각각의 최대 연속 추출횟수를 출력해 줍니다.


오늘은 임의의 정수를 추출할 때 유용한 Random 객체 내 nextInt() 메서드 사용방법에 대해 알아봤습니다.

포스팅 내용에 오류가 있다면 피드백 언제나 환영합니다.

그럼 오늘도 즐겁고 건강한 하루 보내시길 바랍니다.

고맙습니다 :)

 

728x90
반응형
Comments