자바 난수 생성기

Java에서 난수 생성 방법을 인터랙티브 코드 예제로 배우세요. 자세한 설명과 함께 Random.nextInt(), SecureRandom, ThreadLocalRandom, Math.random()을 탐색해 보세요.

자바 코드 편집기

Java에서 난수 생성 방법을 인터랙티브 코드 예제로 배우세요. 자세한 설명과 함께 Random.nextInt(), SecureRandom, ThreadLocalRandom, Math.random()을 탐색해 보세요.

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random rand = new Random();
        int min = 1;
        int max = 100;
        int quantity = 5;

        System.out.println("Random numbers between " + min + " and " + max + ":");
        for (int i = 0; i < quantity; i++) {
            int num = rand.nextInt(max - min + 1) + min;
            System.out.print(num + " ");
        }
    }
}

출력

브라우저 미리보기이며 Java나 C++를 실행하지 않습니다. 암호화 용도로 적합하지 않습니다.

예시 미리보기

java.util.Random을 이용한 기본 랜덤

Random.nextInt()를 사용해 특정 범위의 무작위 정수를 생성합니다. 이 방법은 자바에서 범용 난수 생성에 가장 일반적인 방법입니다.

빠른 랜덤 번호가 필요하신가요?

코드를 작성하지 않고도 즉각적인 결과를 얻으려면 온라인 난수 생성기를 사용해 보세요.

오픈 난수 생성기

Java 난수 생성 이해하기

자바는 다양한 사용 사례에 최적화된 난수 생성 방법을 제공합니다. java.util.Random은 선형 합동 생성기(LCG) 알고리즘을 사용하며, SecureRandom은 암호학적으로 강력한 난수를 제공하고, ThreadLocalRandom은 동시 애플리케이션을 위한 스레드 안전 생성을 제공하며, Math.random()은 무작위 중복을 간단히 생성하는 방법을 제공합니다.

java.util.Random

java.util.Random은 시뮬레이션, 게임 및 일반 프로그래밍 작업에 적합한 빠른 의사 난수 생성을 제공합니다. 기본 사용에는 스레드 안전.

SecureRandom

java.security.SecureRandom은 플랫폼별 알고리즘(SHA1PRNG, NativePRNG)을 사용하여 보안 애플리케이션을 위한 암호학적으로 안전한 난수를 생성합니다.

ThreadLocalRandom

ThreadLocalRandom은 멀티스레드 애플리케이션을 위해 특별히 설계된 효율적인 스레드 안전 난수 생성을 제공하여 경쟁과 동기화 오버헤드를 피합니다.

math.random()

Math.random()은 0.0에서 1.0 사이의 이중 값을 반환하는 간단한 메서드입니다. 빠른 계산에는 편리하지만 다른 옵션들보다 유연성이 떨어집니다.

일반적인 사용 사례

게임 및 시뮬레이션

Random.nextInt() 또는 ThreadLocalRandom 인게임 루프를 사용해 무작위 주사위 굴림, 카드 뽑기, 적 스폰, 게임 이벤트를 생성하세요.

보안 및 암호학

SecureRandom을 사용하여 암호화 강도의 무작위성을 위해 안전한 비밀번호, API 키, 세션 토큰, 암호화 솔트를 생성하세요.

동시 응용

병렬 스트림과 다중 스레드 애플리케이션에서 ThreadLocalRandom을 사용하여 경쟁을 피하고 성능을 향상시키세요.

소프트웨어 테스트

무작위 테스트 데이터, 퍼즈 테스트 입력, 엣지 케이스를 생성하여 Java 애플리케이션에서 강력한 코드 커버리지와 버그 탐지를 보장합니다.

Java 난수 생성 작동 방식

Java's java.util.Random class uses a Linear Congruential Generator (LCG) algorithm with a 48-bit seed. It provides a simple way to generate pseudo-random numbers and is synchronized for thread safety.

The SecureRandom class provides cryptographically strong random numbers by using platform-specific implementations. On most systems, it uses the operating system's entropy source or hardware random number generators.

ThreadLocalRandom, introduced in Java 7, is designed for multi-threaded applications. It uses a random number generator that is isolated to the current thread, avoiding synchronization overhead and contention.

실용 팁

🎯

올바른 API 선택

간단한 경우에는 Random을, 보안에는 SecureRandom을, 동시 앱에는 ThreadLocalRandom을, 빠른 프로토타입에는 Math.random()만 사용하세요. 각 각각은 고유한 사용 사례가 있습니다.

🔒

보안을 위해 항상 SecureRandom을 사용하세요

비밀번호, 토큰, 암호학적 연산에 Random이나 Math.random()을 절대 사용하지 마세요. 항상 SecureRandom을 사용하여 강한 무작위성을 보장하고 예측 가능한 패턴을 피하세요.

⚡

동시 접근 최적화

멀티스레드 애플리케이션에서는 ThreadLocalRandom이 Random 객체를 동기화하는 것보다 훨씬 빠릅니다. 병렬 스트림과 동시 컬렉션에서 사용하세요.

기술 사양

알고리즘

  • 선형 합동 생성기 (무작위 클래스)
  • SHA1PRNG 또는 NativePRNG (SecureRandom)
  • ThreadLocalRandom (Java 7+, 랜덤 기반)
  • 의사 난수 이중 (Math.random())

성능 특성

  • Math.random(): 단순 더블에서 가장 빠른
  • ThreadLocalRandom: 동시 접근에 가장 적합합니다
  • 랜덤: 좋은 범용 동기화 오버헤드
  • SecureRandom: 엔트로피 수집으로 인해 느려집니다

자주 묻는 질문

어떤 Java API가 포함되어 있나요?

java.util.Random, SecureRandom, ThreadLocalRandom, Math.random()이 포함되며, 각각에 대한 집중적인 예제가 제공됩니다.

예제를 직접 맞춤 설정할 수 있나요?

네. 매개변수 패널에서 최솟값, 최댓값, 생성 개수를 설정한 후 실행하면 결과를 즉시 확인할 수 있습니다.

보안 목적으로는 어떤 것을 사용해야 하나요?

SecureRandom을 사용하세요. 다른 API는 예측 가능하므로 토큰, 키 또는 비밀번호 생성의 기반으로 사용해서는 안 됩니다.

멀티스레드 코드에서는 어떤가요?

ThreadLocalRandom은 스레드 간 경합을 방지하며, 병렬 스트림과 스레드 풀 안에서 일반적으로 선택되는 API입니다.

Java에서 두 값 사이의 난수를 생성하려면 어떻게 하나요?

nextInt(bound)를 호출하면 0부터 bound-1까지의 값이 생성되므로 nextInt(50)은 0부터 49까지의 값을 반환합니다. 사용자 지정 범위가 필요하면 오프셋을 더하세요. 예를 들어 nextInt(10) + 5는 5부터 14까지의 값을 생성합니다. Java 17부터는 nextInt(origin, bound)를 한 번의 호출로 처리할 수 있으며, origin은 포함되고 bound는 제외됩니다.

Math.random()이 1을 반환할 수 있나요?

아니요. Math.random()은 0.0 이상 1.0 미만의 double 값을 반환하므로 0.0이나 0.9999는 나올 수 있지만 1.0은 절대 나오지 않습니다. 내부적으로는 단일 java.util.Random 인스턴스에 위임하기 때문에 최신 코드에서는 Random 메서드를 직접 호출하는 것이 더 명확합니다.

프로그램을 실행할 때마다 같은 난수가 나오는 이유는 무엇인가요?

new Random(42)처럼 고정된 시드로 생성한 Random은 항상 동일한 시퀀스를 재현합니다. 시드 인수를 생략하면 System.nanoTime()과 결합된 고유한 값으로 자동으로 시드가 설정됩니다. 고정 시드는 재현 가능한 테스트와 디버깅에 유용하지만 프로덕션 코드에는 사용하지 않는 것이 좋습니다.

배열이나 리스트에서 임의의 요소를 선택하려면 어떻게 하나요?

인덱스를 생성한 후 해당 위치를 읽으세요. nextInt(n)은 0부터 n-1까지의 범위를 다루므로 리스트는 list.get(random.nextInt(list.size())), 배열은 array[random.nextInt(array.length)]를 사용하면 됩니다. 또는 Collections.shuffle()을 사용하면 한 번의 실행으로 리스트 전체 순서를 무작위로 섞을 수 있어 단일 셔플 내에서는 요소가 중복되지 않습니다.

참고 문헌 및 리소스