Java 난수 생성: Random 클래스와 Math.random 실전 가이드
이 간결한 튜토리얼에서는 Java에서 난수 값을 생성하는 두 가지 가장 일반적인 접근법인 java.util.Random과 Math.random()을 배웁니다. 둘 다 JDK에 포함되지만, 각기 약간 다른 용례와 고유한 기능을 제공합니다.
- java.util.Random – 모든 기본 타입의 숫자 생성 가능, 재현성을 위해 시드(seed) 설정 가능
- Math.random() – 객체 생성 없이 [0.0, 1.0) 범위의 double을 빠르게 얻는 방법
java.util.Random으로 난수 생성
Random 클래스는 int, long, float, double, boolean 값을 생성할 수 있습니다. 한 번 인스턴스화하여 같은 객체를 재사용하면 성능 오버헤드를 피할 수 있습니다.
아래는 0부터 99(포함) 사이의 난수 정수 10개를 출력하는 완전한 예제입니다. 상한을 포함하려면 인수에 1을 더하세요.
import java.util.Random;
public class RandomNumbers {
public static void main(String[] args) {
Random rng = new Random();
for (int i = 0; i < 10; i++) {
int randomNumber = rng.nextInt(100); // 0-99
System.out.println("Random No: " + randomNumber);
}
}
}
일반적인 출력:
Random No: 17
Random No: 57
Random No: 73
Random No: 48
Random No: 68
Random No: 86
Random No: 34
Random No: 97
Random No: 73
Random No: 18
Random은 대부분의 용도에서 스레드 안전하므로, 필요시 여러 스레드에서 같은 인스턴스 공유 가능. 재현 가능한 시퀀스를 위해 시드 전달: new Random(42).
Math.random()으로 난수 생성
[0.0, 1.0) 범위의 double만 빠르게 필요할 때 Math.random()이 편리합니다. 내부적으로 단일 Random 인스턴스에 위임하므로 소규모 작업에 효율적입니다.
예제: double 값 10개 생성.
public class DemoRandom {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(Math.random());
}
}
}
일반적인 출력:
0.46518450373334297
0.14859851177803485
0.5628391820492477
0.6323378498048606
0.1740198445692248
0.9140544122258946
0.9167350036262347
0.49251219841030147
0.7426056725722353
다른 범위의 정수나 double을 생성하려면 Math.random()에 산술을 결합하세요. 예를 들어 1부터 10까지의 난수 정수(포함): (int)(Math.random() * 10) + 1.
핵심 요약
- 다양한 기본 타입이나 시드를 통한 결정적 시퀀스가 필요하면
java.util.Random 사용
- [0.0, 1.0) 구간의 빠른 일회용 double이 필요하면
Math.random() 사용
- 반복된 시드 오버헤드 방지를 위해 항상 같은
Random 인스턴스 재사용
- 동시성 환경에서 스레드 안전 고성능 난수가 필요하면
ThreadLocalRandom 고려 (Java 7+)