Math.random() 메서드는 자바에서 0.0 이상 1.0 미만의 의사난수(pseudorandom number)를 생성하는 대표적인 방법입니다. 생성된 값에 다른 숫자를 곱하면 0~1 범위를 벗어난 원하는 범위의 난수도 손쉽게 만들 수 있으며, 결과값은 0이 될 수는 있지만 절대 1보다 크거나 같지 않습니다.
프로그래밍을 하다 보면 무작위 숫자가 필요한 상황이 자주 발생합니다. 예를 들어 크루즈 여행사를 운영한다고 가정해 봅시다. 고객의 주문 끝에 붙여 예약 참조 번호로 사용할 난수를 생성해야 할 수 있습니다. 아니면 숫자 맞추기 게임을 위해 임의의 숫자가 필요할 수도 있습니다.
자바에는 난수를 생성할 수 있는 다양한 방법이 있으며, 그중 가장 널리 사용되는 것이 바로 Math.random()입니다. 이 글에서는 Math.random() 메서드의 기본 개념부터 실전 예제까지 단계별로 살펴보겠습니다.
자바 Math 클래스란?
자바의 Math 클래스는 숫자에 대해 다양한 수학 연산을 수행할 수 있는 기능들을 모아 놓은 클래스입니다. 예를 들어 소수점을 반올림하는 round(), 거듭제곱을 계산하는 pow() 등의 메서드가 포함되어 있습니다.
Math 클래스를 사용하려면 먼저 코드에 임포트(import)해야 합니다. 아래 import 문을 사용하면 됩니다:
import java.lang.Math;
참고로 java.lang 패키지는 자바 실행 시 자동으로 임포트되기 때문에, 실제로는 import 문 없이 바로 사용할 수도 있습니다. 이 글에서는 Math 클래스의 여러 메서드 중 Math.random()을 집중적으로 다룹니다.
Math.random() 메서드의 동작 원리
자바의 Math.random() 메서드는 의사난수를 생성합니다. 의사난수란 실제 무작위가 아닌, 특정 공식을 통해 무작위처럼 보이는 값을 만들어내는 방식으로 생성된 숫자를 말합니다.
Math.random()이 반환하는 값은 항상 0.0 이상 1.0 미만입니다. 즉, 결과값은 0과 1 사이의 부동소수점(floating-point) 숫자이며, double 타입으로 반환됩니다. double은 부동소수점 값을 저장하기 위한 자바의 기본 데이터 타입입니다.
Math.random() 기본 사용 예제
다음은 Math.random() 메서드를 실제로 사용한 간단한 예제입니다:
import java.lang.Math;
class Main {
public static void main(String[] args) {
double number = Math.random();
System.out.println("Random number: " + number);
}
}
실행 결과:
Random number: 0.4728164736886452
프로그램이 0과 1 사이의 무작위 숫자를 반환한 것을 확인할 수 있습니다. 하지만 이 값은 소수이기 때문에 그대로 사용하기에는 불편한 경우가 많습니다. 예를 들어 숫자 맞추기 게임용 난수를 만든다면 소수가 아닌 정수가 필요할 것입니다.
정수 범위의 난수 생성하기
정수 형태의 난수를 얻으려면 생성된 난수에 특정 숫자를 곱한 뒤 정수로 형 변환(casting)하면 됩니다. 예를 들어 0 이상 10 미만, 즉 0부터 9까지의 정수를 생성하고 싶다면 다음과 같이 작성할 수 있습니다:
class Main {
public static void main(String[] args) {
int number = (int)(Math.random() * 10);
System.out.println("Random number: " + number);
}
}
이 프로그램을 세 번 실행한 결과입니다:
4
6
2
프로그램이 매번 다른 정수를 반환하는 것을 볼 수 있습니다.
코드를 하나씩 살펴보겠습니다. 먼저 프로그램 코드를 담는 Main 클래스를 선언합니다. 그다음 Math.random() 메서드로 난수를 생성하고 여기에 10을 곱합니다. 이렇게 하면 값의 범위가 0.0 이상 10.0 미만으로 확장됩니다. 이후 (int) 캐스팅을 통해 소수점 이하를 버리고 정수로 변환합니다. 마지막 줄에서는 "Random number:"라는 메시지와 함께 생성된 난수를 콘솔에 출력합니다.
더 큰 범위의 숫자가 필요하다면 곱하는 숫자만 바꾸면 됩니다. 예를 들어 0부터 999 사이의 숫자를 생성하려면 * 10을 * 1000으로 변경하면 됩니다:
class Main {
public static void main(String[] args) {
int number = (int)(Math.random() * 1000);
System.out.println("Random number: " + number);
}
}
세 번 실행한 결과:
181
914
939
두 숫자 사이의 범위로 난수 생성하기
Math.random() 메서드는 매개변수를 받지 않기 때문에, 메서드 자체만으로는 생성되는 숫자의 범위를 조절할 수 없습니다. 하지만 직접 커스텀 메서드를 만들면 원하는 범위 내의 난수를 손쉽게 생성할 수 있습니다.
예를 들어 크루즈 여행사에서 고객 주문을 구분하기 위한 난수를 생성하는 앱을 만든다고 가정해 봅시다. 이 번호는 고객 이름 뒤에 붙여 사용되며, 200에서 500 사이의 값이어야 한다고 해보겠습니다. 이 경우 다음과 같은 코드를 사용할 수 있습니다:
class Main {
public static int generateTicketNumber(int min, int max) {
int range = (max - min) + 1;
return (int)(Math.random() * range) + min;
}
public static void main(String args[]) {
String customerName = "JohnMcIver";
int randomNumber = generateTicketNumber(200, 500);
System.out.println(customerName + randomNumber);
}
}
실행 결과:
JohnMcIver321
이 프로그램은 200에서 500 사이의 난수를 생성한 뒤, 고객 이름 뒤에 붙여 콘솔에 출력합니다.
코드의 작동 방식을 단계별로 살펴보겠습니다:
- 최솟값(min)과 최댓값(max) 두 개의 매개변수를 받는
generateTicketNumber()메서드를 선언합니다. generateTicketNumber()메서드는 min과 max를 이용해 범위(range)를 계산하고,Math.random()으로 해당 범위 안의 난수를 생성합니다.(max - min)에 1을 더하는 이유는 최댓값도 범위에 포함시키기 위함입니다.- main 메서드가 실행되면
customerName변수가 선언되고 "JohnMcIver" 값이 할당됩니다. - 이어서
generateTicketNumber()메서드가 호출되며, 인수로 200과 500이 전달됩니다. 이 값들은 각각 결과가 나올 범위의 최솟값과 최댓값에 해당합니다. 메서드의 반환값은randomNumber변수에 저장됩니다. - 마지막으로 고객 이름과 생성된 난수가 문자열 연결(concatenation)로 합쳐져 콘솔에 출력됩니다.
마무리
자바의 Math.random() 메서드는 의사난수를 생성하는 데 사용됩니다. 이 메서드는 0과 1 사이의 값을 반환하며, 여기에 곱셈과 형 변환을 조합하면 원하는 범위의 난수로 쉽게 변환할 수 있습니다.
이 글에서는 자바 Math 클래스의 기본 개념과 Math.random() 메서드로 난수를 생성하는 방법을 알아보았습니다. 또한 커스텀 메서드를 활용해 지정한 두 숫자 사이의 범위에서 난수를 생성하는 방법도 함께 살펴보았습니다.
이제 여러분도 자바에서 프로처럼 난수를 생성할 준비가 되었습니다!