JavaTM Platform
Standard Ed. 6

java.util
클래스 Random

java.lang.Object 
  상위를 확장 java.util.Random
모든 구현된 인터페이스:
Serializable
직계의 기존의 서브 클래스:
SecureRandom


public class Random
extends Object
implements Serializable

Random 클래스의 인스턴스는, 일련의 의사 난수를 생성합니다. 클래스에서는 48 비트의 배정을 사용해, 이 배정은 선형 합동법으로 변경됩니다. 자세한 것은 Donald Knuth 저 「The Art of Computer Programming, Volume 3」의 3.2. 1 을 참조해 주세요.  

2 개의 Random 인스턴스가 같은 배정으로 생성되어 각각 대해 같은 메소드 호출의 순서가 생성되는 경우는, 같은 번호의 순서가 생성되고 돌려주어집니다. 이 프로퍼티을 보증하기 위해서, 고유의 알고리즘이 Random 클래스로 지정됩니다. Java 코드의 절대적인 이식성의 보관 유지를 위해서(때문에), Java 의 구현은 여기에 나타나고 있는 Random 클래스의 알고리즘을 모두 사용할 필요가 있습니다. 다만,Random 클래스의 서브 클래스는, 모든 메소드의 일반 규약에 준거한 것이면 다른 알고리즘도 사용할 수 있습니다.  

Random 클래스에 의해 구현되는 알고리즘에서는, 각 호출로 의사 난수적으로 생성된 최대 32 비트를 제공할 수 있는 protected 유틸리티 메소드가 사용됩니다.  

많은 어플리케이션의 경우,Math.random() 메소드를 사용하는 편이 간단합니다.

도입된 버젼:
1.0
관련 항목:
직렬화 된 형식

생성자 의 개요
Random ()
          신규 난수 제네레이터를 작성합니다.
Random (long seed)
          long 형의 배정을 사용해 난수 제네레이터를 작성합니다.
 
메소드의 개요
protected  int next (int bits)
          다음의 의사 난수를 생성합니다.
 boolean nextBoolean ()
          난수 제네레이터의 순서를 사용해, 일님 분포의 boolean 형의 다음의 의사 난수를 돌려줍니다.
 void nextBytes (byte[] bytes)
          랜덤 바이트를 생성해, 사용자 지정의 바이트 배열에 배치합니다.
 double nextDouble ()
          난수 제네레이터의 순서에 근거해,0.0 에서 1.0 의 범위의 일님 분포의 double 형의 다음의 의사 난수치를 돌려줍니다.
 float nextFloat ()
          난수 제네레이터의 순서에 근거해,0.0 에서 1.0 의 범위의 일님 분포의 float 형의 다음의 의사 난수치를 돌려줍니다.
 double nextGaussian ()
          난수 제네레이터의 순서에 근거해, 평균 0.0, 표준 편차 1.0 의 Gauss ( 「정규」) 분포의,double 형의 다음의 의사 난수치를 돌려줍니다.
 int nextInt ()
          난수 제네레이터의 순서를 사용해, 일님 분포의 int 형의 의사 난수를 돌려줍니다.
 int nextInt (int n)
          난수 제네레이터의 순서를 사용해, 0 으로부터 지정된 값의 범위 (0 은 포함하지만, 그 지정된 값은 포함하지 않는다)에서 일님 분포의 int 형의 의사 난수를 돌려줍니다.
 long nextLong ()
          난수 제네레이터의 순서를 사용해, 일님 분포의 long 형의 다음의 의사 난수를 돌려줍니다.
 void setSeed (long seed)
          단일의 long 형의 배정을 사용해, 난수 제네레이터의 배정을 설정합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

생성자 의 상세

Random

public Random()
신규 난수 제네레이터를 작성합니다. 이 생성자 은, 난수 제네레이터의 배정을, 이 생성자 의 다른 호출과 구별 가능한 값으로 설정합니다.


Random

public Random(long seed)
long 형의 배정을 사용해 난수 제네레이터를 작성합니다. 배정이란, 의사 난수 제네레이터의 내부 상태의 초기치입니다. 이 값은 next(int) 메소드에 의해 유지 관리됩니다.

호출 new Random(seed) 는 다음의 코드와 등가입니다.

 Random rnd = new Random();
 rnd.setSeed(seed);

파라미터:
seed - 초기 배정
관련 항목:
setSeed(long)
메소드의 상세

setSeed

public void setSeed(long seed)
단일의 long 형의 배정을 사용해, 난수 제네레이터의 배정을 설정합니다. setSeed 의 일반 규약에서는, 배정으로서 인수 seed 를 사용해 작성된지 얼마 안된 상태와 같게 되도록(듯이), 이 난수 제네레이터 객체 상태를 변경합니다. Random 클래스에 의한 setSeed 메소드의 구현에서는, 배정을
(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)
에 프리미티브(primitive)으로 갱신해,nextGaussian() 에 의해 사용되는 haveNextNextGaussian 플래그를 클리어 합니다.

Random 클래스에 의한 setSeed 의 구현은, 지정된 배정의 48 비트밖에 사용하고 있습니다. 그러나 일반적으로, 오버라이드(override) 하는 메소드는,long 인수의 64 비트 모든 것을 배정치로서 사용할 수 있습니다.

파라미터:
seed - 초기 배정

next

protected int next(int bits)
다음의 의사 난수를 생성합니다. 이 메소드는, 다른 모든 메소드에 의해 사용되므로, 서브 클래스에 의해 덧쓰기됩니다.

next 의 일반 규약은,int 치를 돌려주어, 인수 bits1 ~ 32 (이것을 포함한다)의 경우는 반환값의 그 만큼의 개수의 하위 비트가 거의 독립에 선택된 비트치가 된다, 라는 것입니다. 값이 0 또는 1 이 되는 확률은, 어느 비트도 대충 같아집니다. Random 클래스에 의한 next 메소드의 구현에서는, 배정을

(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
에 프리미티브(primitive)으로 갱신해, 다음의 값을 돌려줍니다.
(int)(seed >>> (48 - bits)). 
이것은, D. H. Lehmer 에 의해 정의된, 선형 합동 의사 난수 제네레이터입니다. 자세한 것은 Donald Knuth 저 「The Art of Computer Programming, Volume 3:Seminumerical Algorithms」의 3.2. 1 을 참조해 주세요.

파라미터:
bits - 랜덤 비트
반환값:
이 난수 제네레이터의 순서에 근거하는 다음의 의사 난수치
도입된 버젼:
1.1

nextBytes

public void nextBytes(byte[] bytes)
랜덤 바이트를 생성해, 사용자 지정의 바이트 배열에 배치합니다. 작성되는 랜덤 바이트의 수는, 바이트 배열의 길이와 동일해집니다.

Random 클래스에 의한 nextBytes 메소드의 구현은, 다음과 동등합니다.

 public void nextBytes(byte[] bytes) {
   for (int i = 0; i < bytes.length; )
     for (int rnd = nextInt(), n = Math.min(bytes.length - i, 4);
          n-- > 0; rnd >>= 8)
       bytes[i++] = (byte) rnd;
 }

파라미터:
bytes - 난수 바이트를 포함하는 바이트 배열
예외:
NullPointerException - 바이트 배열이 null 인 경우
도입된 버젼:
1.1

nextInt

public int nextInt()
난수 제네레이터의 순서를 사용해, 일님 분포의 int 형의 의사 난수를 돌려줍니다. nextInt 의 일반 규약에서는, 1 개의 int 형의 값이 의사 난수로서 생성되어 돌려주어집니다. 32 의 가능한 모든 int 치가 (거의) 균등인 확률로 생성됩니다.

Random 클래스에 의한 nextInt 메소드의 구현은, 다음과 동등합니다.

 public int nextInt() {
   return next(32);
 }

반환값:
난수 제네레이터의 순서에 근거하는, 일님 분포의 int 형의 다음의 의사 난수치

nextInt

public int nextInt(int n)
난수 제네레이터의 순서를 사용해, 0 으로부터 지정된 값의 범위 (0 은 포함하지만, 그 지정된 값은 포함하지 않는다)에서 일님 분포의 int 형의 의사 난수를 돌려줍니다. nextInt 의 일반 규약에서는, 지정된 범위내의 1 개의 int 형의 값이 의사 난수로서 생성되어 돌려주어집니다. 가능한 모든 n 개의 int 치가 (거의) 균등인 확률로 생성됩니다. Random 클래스에 의한 nextInt(int n) 메소드의 구현은, 다음과 동등합니다.
 public int nextInt(int n) {
   if (n <= 0)
     throw new IllegalArgumentException("n must be positive");

   if ((n & -n) == n)  // i.e., n is a power of 2
     return (int)((n * (long) next(31)) >> 31);

   int bits, val;
   do {
       bits = next(31);
       val = bits % n;
   } while (bits - val + (n-1) < 0);
   return val;
 }

상기의 설명으로 「거의」라고 하는 말을 사용하고 있는 것은, next 메소드가 단지 거의 무관계하게 선택된 비트의 중립적인 소스이기 때문입니다. 랜덤에 선택된 비트의 완전한 소스이다고 하면, 나타난 알고리즘은 지정된 범위로부터 완전한 일관성으로 int 형의 값을 선택하게 됩니다.  

이 알고리즘은 다소 취급하기 힘든 면이 있습니다. 이 알고리즘은 한결같지 않은 분포가 되는 값을 거절합니다 (2^31 가 n 로 갈라지지 않는 것에 밤). 값이 거절되는 확률은 n 에 따라서 다릅니다. 최악의 케이스는 n=2^30+1 로, 이 경우, 거절의 확률은 1/2 이 되어, 루프가 강제 종료할 때까지가 예상되는 반복 회수는 2 회입니다.  

이 알고리즘은, n 가 2 의 누승인 케이스를 특별히 처리합니다. 이 알고리즘은, 기본으로 되는 의사 난수 제네레이터로부터 적절한 수의 상위 비트를 돌려줍니다. 특별한 처리가 없는 경우는, 적절한 수의 「하위」비트가 돌려주어집니다. 이 클래스에서 구현되고 있는 것 같은 선형 합동 의사 난수 제네레이터는, 하위 비트의 값의 순서로 주기가 짧은 일이 알려져 있습니다. 그 때문에, 이 특별한 케이스에서는, n 가 2 가 작은 누승인 경우, 이 메소드가 연속한 호출에 의해 반환되는 값의 순서의 길이가 큰폭으로 길어집니다.

파라미터:
n - 반환되는 난수의 한계치. 정의 값이 아니면 안된다
반환값:
난수 제네레이터의 순서에 근거하는,0 (이것을 포함한다)으로부터 n (이것을 포함하지 않는다)의 범위의 일님 분포의 int 형의 다음의 의사 난수치
예외:
IllegalArgumentException - n 가 정이 아닌 경우
도입된 버젼:
1.2

nextLong

public long nextLong()
난수 제네레이터의 순서를 사용해, 일님 분포의 long 형의 다음의 의사 난수를 돌려줍니다. nextLong 의 일반 규약에서는, 1 개의 long 형의 값이 의사 난수로서 생성되어 돌려주어집니다.

Random 클래스에 의한 nextLong 메소드의 구현은, 다음과 동등합니다.

 public long nextLong() {
   return ((long) next(32) << 32) + next(32);
 }
Random 클래스는 48 비트만을 포함한 배정을 사용하기 위해(때문에), 이 알고리즘은 가능한 모든 long 치의 일부 밖에 돌려주지 않습니다.

반환값:
난수 제네레이터의 순서에 근거하는, 일님 분포의 long 형의 다음의 의사 난수치

nextBoolean

public boolean nextBoolean()
난수 제네레이터의 순서를 사용해, 일님 분포의 boolean 형의 다음의 의사 난수를 돌려줍니다. nextBoolean 의 일반 규약에서는, 1 개의 boolean 형의 값이 의사 난수로서 생성되어 돌려주어집니다. 값 truefalse 가 거의 균등인 확률로 생성됩니다.

Random 클래스에 의한 nextBoolean 메소드의 구현은, 다음과 동등합니다.

 public boolean nextBoolean() {
   return next(1) ! = 0;
 }

반환값:
난수 제네레이터의 순서에 근거하는, 일님 분포의 boolean 형의 다음의 의사 난수치
도입된 버젼:
1.2

nextFloat

public float nextFloat()
난수 제네레이터의 순서에 근거해,0.0 에서 1.0 의 범위의 일님 분포의 float 형의 다음의 의사 난수치를 돌려줍니다.

nextFloat 의 일반 규약에서는,0.0f 에서 1.0f 의 범위 (0.0f 는 포함하지만, 1.0f 는 포함하지 않는다)로부터 거의 균등인 확률로 선택된 1 개의 float 치가 의사 난수로서 생성되어 돌려주어집니다. m x 2-24 라고 하는 형식 (m 는 224 미만의 정의 정수)의 224 의 가능한 모든 float 치가 거의 균등인 확률로 생성됩니다.

Random 클래스에 의한 nextFloat 메소드의 구현은, 다음과 동등합니다.

 public float nextFloat() {
   return next(24) / ((float)(1 << 24));
 }

상기의 설명으로 「거의」라고 하는 말을 사용하고 있는 것은, next 메소드가 단지 거의 무관계하게 선택된 비트의 중립적인 소스이기 때문입니다. 랜덤에 선택된 비트의 완전한 소스이다고 하면, 나타난 알고리즘은 지정된 범위로부터 완전한 일관성으로 float 형의 값을 선택하게 됩니다.

[이전의 버젼의 Java 에서는, 결과는 다음과 같이 잘못해 계산되었습니다.

 return next(30) / ((float)(1 << 30));
이것이기도 한 정도 동일하게 생각됩니다만, 실제로는, 부동 소수점수(실수)의 둥근에서의 바이어스를 위해서(때문에) 다소의 격차가 생기므로, 유효 숫자의 하위 비트가, 1 보다 0 이 되는 것이 많아지기 쉽상이었습니다. ]

반환값:
난수 제네레이터의 순서에 근거하는,0.0 에서 1.0 의 범위의 일님 분포의 float 형의 다음의 의사 난수치

nextDouble

public double nextDouble()
난수 제네레이터의 순서에 근거해,0.0 에서 1.0 의 범위의 일님 분포의 double 형의 다음의 의사 난수치를 돌려줍니다.

nextDouble 의 일반 규약에서는,0.0d 에서 1.0d 의 범위 (0.0d 는 포함하지만, 1.0d 는 포함하지 않는다)로부터 (거의) 균등인 확률로 선택된 1 개의 double 치가 의사 난수로서 생성되어 돌려주어집니다.

Random 클래스에 의한 nextDouble 메소드의 구현은, 다음과 동등합니다.

 public double nextDouble() {
   return (((long) next(26) << 27) + next(27))
     / (double)(1L << 53);
 }

상기의 설명으로 「거의」라고 하는 말을 사용하고 있는 것은,next 메소드가 단지 거의 무관계하게 선택된 비트의 중립적인 소스이기 때문입니다. 랜덤에 선택된 비트의 완전한 소스이다고 하면, 나타난 알고리즘은 지정된 범위로부터 완전한 일관성으로 double 형의 값을 선택하게 됩니다.  

[이전의 버젼의 Java 에서는, 결과는 다음과 같이 잘못해 계산되었습니다.

 return (((long) next(27) << 27) + next(27))
     / (double)(1L << 54);
이것이기도 한 정도 동일하게 생각됩니다만, 실제로는, 부동 소수점수(실수)의 둥근에서의 바이어스를 위해서(때문에) 큰 격차가 생기므로, 유효 숫자의 하위 비트가 0 이 되는 것이 1 이 되는 것의 3 배 있었습니다. 이 정도의 격차는 실제로는 문제가 되지 않습니다만, 완전성을 요구해 수정을 시도하고 있습니다. ]

반환값:
난수 제네레이터의 순서에 근거하는,0.0 에서 1.0 의 범위의 일님 분포의 double 형의 다음의 의사 난수치
관련 항목:
Math.random()

nextGaussian

public double nextGaussian()
난수 제네레이터의 순서에 근거해, 평균 0.0, 표준 편차 1.0 의 Gauss ( 「정규」) 분포의,double 형의 다음의 의사 난수치를 돌려줍니다.  

nextGaussian 의 일반 규약에서는, 평균 0.0, 표준 편차 1.0 의 거의 일반적으로의 정규 분포로부터 선택된 1 개의 double 치가, 의사 난수로서 생성되어 돌려주어집니다.

Random 클래스에 의한 메소드 @code nextGaussian} 의 구현은, 다음의, thread에 대해서 안전한 버젼과 동등합니다.

 private double nextNextGaussian;
 private boolean haveNextNextGaussian = false;

 public double nextGaussian() {
   if (haveNextNextGaussian) {
     haveNextNextGaussian = false;
     return nextNextGaussian;
   } else {
     double v1, v2, s;
     do {
       v1 = 2 * nextDouble() - 1;   // between -1. 0 and 1.0
       v2 = 2 * nextDouble() - 1;   // between -1. 0 and 1.0
       s = v1 * v1 + v2 * v2;
     } while (s >= 1 || s == 0);
     double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) /s);
     nextNextGaussian = v2 * multiplier;
     haveNextNextGaussian = true;
     return v1 * multiplier;
   }
 }
이것은, Donald E. Knuth 저 「The Art of Computer Programming, Volume 3:Seminumerical Algorithms」의 3.4. 1 의 C, 알고리즘 P 로 설명되고 있는, G. E. P. Box, M. E. Muller, 및 G. Marsaglia 의 「polar method」를 사용합니다. StrictMath.logStrictMath.sqrt 의 호출만으로 2 개의 다른 값을 생성하는 것에 주의해 주세요.

반환값:
난수 제네레이터의 순서에 근거하는, 평균 0.0, 표준 편차 1.0 의 Gauss ( 「정규」) 분포의,double 형의 다음의 의사 난수치

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.