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 참고.)
본문
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(제외) 범위를 지정할 수 있어요.