Random — 의사 난수 생성기

Random — 의사 난수 생성기

Random의사 난수(pseudorandom) 스트림을 생성하는 데 사용되는 클래스예요. 그 주기는 단지 2^48이고, 48비트 시드를 선형 합동 공식(linear congruential formula)으로 수정해요. (Donald E. Knuth, The Art of Computer Programming, Volume 2, 3판, Section 3.2.1 참고.)

출처: Java API Reference

본문

public class Random extends Object implements RandomGenerator, Serializable

같은 시드로 두 Random 인스턴스를 만들고 같은 메서드 호출 순서를 쓰면 동일한 숫자 시퀀스를 생성·반환해요. 이 속성을 보장하기 위해 Random 클래스에 특정 알고리즘이 명세돼 있어요. 자바 구현은 이 클래스에 여기 나온 모든 알고리즘을 사용해야 해요(자바 코드의 절대 이식성을 위해). 단, Random의 서브클래스는 모든 메서드의 일반 계약을 따른다면 다른 알고리즘을 쓸 수 있어요.

java.util.Random 인스턴스는 스레드 안전하지만, 여러 스레드가 같은 인스턴스를 동시에 쓰면 경합으로 성능이 나빠질 수 있어요. 멀티스레드 설계에서는 ThreadLocalRandom을 고려해요. 또 Random 인스턴스는 암호학적으로 안전하지 않아요. 보안에 민감한 애플리케이션에는 SecureRandom을 사용해요.

생성자

  • Random() — 새 난수 생성기를 만들어요. 시드를 다른 호출과 구별될 가능성이 매우 높은 값으로 설정해요.
  • Random(long seed) — 단일 long 시드로 만들어요. 시드는 next(int)가 유지하는 내부 상태의 초기 값이에요.
  • Random.from(RandomGenerator)RandomGenerator 인자에 메서드 호출을 위임하는 Random 인스턴스를 반환해요. setSeed는 항상 UnsupportedOperationException을 던지고, 반환된 인스턴스는 직렬화되지 않아요.

핵심 메서드

  • setSeed(long) — 시드를 설정·갱신해요(선택적 연산).
  • next(int bits) — 다음 의사 난수를 생성해요. bits가 1~32면 해당 수의 하위 비트가 거의 독립적으로 선택된 비트 값이에요.
  • nextBytes(byte[]) — 랜덤 바이트를 배열에 채워요.
  • nextInt() — [0, 2^32)에 거의 균등하게 분포된 int를 반환해요.
  • nextInt(int bound) — 0(포함)~bound(제외) 범위의 int를 반환해요.
  • nextLong() / nextBoolean() / nextFloat() / nextDouble() — 각 타입의 난수를 반환해요.
  • nextGaussian() — 평균 0.0, 표준편차 1.0의 정규(가우시안) 분포 double을 반환해요.

스트림 메서드

  • ints(...) / longs(...) / doubles(...) — 의사 난수 IntStream/LongStream/DoubleStream을 생성해요. 크기를 지정하거나 무한 스트림을 만들고, origin(포함)/bound(제외) 범위를 지정할 수 있어요.

더 알아보기 (Learn more)