주인장의 프로그래밍 개발 공부방

[자바 프로그래밍 기초] 6. 난수를 뽑아주는 Math.random() 본문

Java/자바 프로그래밍 기초

[자바 프로그래밍 기초] 6. 난수를 뽑아주는 Math.random()

거신 2023. 1. 6. 09:41

이번 시간에는 자바에서 난수를 만들어야 할 때 유용하게 사용할 수 있는

Math.random()에 대해서 살펴보도록 하자.

 

1. 난수

 

난수(亂數)란 정의된 범위 내에서 무작위로 추출된 를 일컫는다.

난수는 누구라도 그 다음에 나올 값을 확신할 수 없어야 한다.

-출처 : 위키백과-

 

난수의 의미를 찾아보면 이렇게 설명하고 있는데

한마디로 랜덤한 숫자란 뜻이다.

우리가 가끔씩 프로그램을 개발할 때 난수가 필요한 경우가 있다.

대표적으로 로또번호 생성기추첨기, 암호키 생성 등과 같이

우리가 전혀 추측할 수 없는 숫자나 값을 뽑아내야 할 때가 바로 그 경우인데

이런 걸 구현할 수 있도록 자바에서는 Math.random()라는 메소드를 제공하고 있다.

 

그리고 Random클래스라는 랜덤객체를 생성할 수 있는 클래스도 제공하는데

지금 알아보려는 Math.random()와는 비슷하면서도 다르기 때문에

바로 Math.random()에 대해서 먼저 알아보고 이어서 알아보도록 하자.

(사실 Math.random()은 Random클래스를 이용한다.)

 

다시 본론으로 돌아와 난수의 뜻이 뭔지는 알겠으니

이제 그 난수인지 뭔지 하는 걸 한 번 뽑아보자.

 

2. Math.random()

 

자바에서 난수를 뽑아내는데 가장 간단한 방법이

Math.random()라는 메소드를 사용하는 것이다.

아래의 코드를 살펴보자.

 

예시 1)

public class RandomNumberTest {
	public static void main(String[] args) {
    	
        double randNum = Math.random();	// 0.xxxxxx.....
        System.out.println(randNum);
        
    }
}

예시 1)Math.random()를 사용하는 방법이 되겠다.

Math.random()double형의 임의의 숫자를 리턴하는데

숫자의 범위는 0.0 ~ 0.99999.....가 되겠다.

다시 말해, 0.0이상 1.0 미만의 임의의 숫자를 리턴하는 것이다.

(간혹 인터넷에서 Math.random()에 대해서 검색하다 보면

출력되는 수의 범위가 0.0에서 1.0까지라고 설명하는 글들이 있는데

정확히는 1.0 미만이기 때문에 1은 절대로 나올 수 없다.)

 

예시 2)

public static double random() {
     return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}

Math 클래스에서 random()를 찾아보면

예시 2)와 같은 내용을 확인할 수 있을 것이다.

해당 내용이 중요한 것은 아니고 메소드가 어떻게 되어 있는지 참고용으로 넣어봤다.

 

예시 2)에서 알 수 있듯이 Math.random()static 메소드이므로

인스턴스를 생성하지 않고 Math.random()의 형태로 클래스명으로 바로 호출할 수 있다.

물론 이클립스 같은 IDE에서 작성하면 자동으로 추가되겠지만

일단은 소스파일 내에서 java.lang.Math를 import 해야 한다는 건 기본으로 알고 있자.

 

그런데 이렇게만 놓고 봐서는 막상 써먹으려면 어찌해야 하나 싶다.

리턴을 0.0에서 0.999999.... 이 사이의 수를 하나 뽑아낸다고 하는데

아무리 봐도 이 숫자를 그대로 사용하기엔 난감하다.

그래서 조금 다듬어서 어딘가에 활용하기에 좋은 형태로 만들어 보겠다.

 

예시 3)

double randNum = Math.random(); // 0.xxxxx.....

int num_1 = (int) (randNum * 5);     // 0 ~ 4 사이의 숫자를 뽑아냄
int num_2 = (int) (randNum * 5) + 1; // 1 ~ 5 사이의 숫자를 뽑아냄

Math.random()로 뽑아낸 임의의 숫자를

0 ~ 4 사이의 수로 변환하는 방법

1 ~ 5 사이의 수로 변환하는 방법이다.

예시 3)의 방법을 잘 보면 대충 감을 잡았을 것이라 생각하는데

생성한 임의의 수에 곱하는 수는 뽑아낼 숫자의 개수를 말하는 것이고

뒤에 더하는 숫자는 뽑아낼 숫자의 범위에서 시작하는 숫자라고 눈치챘을 것이다.

 

Math.random()는 최솟값이 0.0이므로 시작하는 숫자는 0일 것이고

곱하는 수는 뽑아낼 숫자의 개수라고 했으니

5를 곱하면 0부터 5개의 숫자

즉, 0 ~ 4 사이에서 임의의 숫자를 뽑아내는 것이다.

그리고 뒤에 더하는 숫자는 뽑아낼 숫자의 범위에서 시작하는 숫자라고 했으니

1을 더하면 1부터 시작하니 숫자의 범위는 1 ~ 5가 되는 것이다.

만약 -3을 더하게 되면 숫자의 범위는 -3 ~ 1이 된다.

 

그리고 뽑아낸 숫자를 int 타입으로 강제 캐스팅을 하는데

앞에서도 설명했듯이 Math.random()리턴타입은 double이다.

그렇기 때문에 우리는 쓸데없는 소수점을 없애고 정수로만 사용하기 위해

int 타입으로 강제 캐스팅을 한 것이다.

물론 int 뿐만 아니라 long, float, short과 같이 숫자로 사용할 수 있는 타입으로 캐스팅도 가능하다.

 

예시 4)

int lottoNumber = (int) (Math.random() * 45) + 1;

흔한 로또번호 생성기 코드이다.

위의 공식만 기억한다면 난수 생성하는 건 별로 어렵지 않다.

 

3. 정리

 

이번 시간에는 자바에서 난수를 뽑아내는 방법 중 하나인

Math.random()를 사용하는 방법과 간단한 예시를 알아봤다.

Math.random()은 자바에서 난수를 뽑아내는데 가장 간단한 방법이고

static 메소드이기 때문에 클래스명인 Math를 앞에 붙이고

인스턴스 생성 없이 Math.random()의 형태로 바로 호출할 수 있다.

(소스파일 내에서 java.lang.Math가 import 되어 있어야 정상작동 한다.)

 

Math.random()double 타입의 값을 리턴하는데

리턴하는 값의 범위는 0.0 ~ 0.9999.... 까지이다.

이를 좀 더 효과적으로 사용하기 위해 가공을 하는 방법으로는

Math.random()으로 뽑은 수에 뽑아내려는 숫자의 개수를 곱하고

해당 수의 범위에서 시작하는 숫자를 더해주면 된다.

그리고 필요에 따라서 숫자로 사용할 수 있는 타입,

int, float, long, short 등의 타입으로 강제 캐스팅을 해서

좀 더 효과적으로 사용할 수도 있겠다.

 

Math.random()에 대해서 알아봤으니

다음에는 Random 클래스를 이용해 난수를 뽑아보도록 하겠다.

Comments