|
JavaTM Platform Standard Ed. 6 |
|||||||||
전의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.Random
public class Random
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()
메소드를 사용하는 편이 간단합니다.
생성자 의 개요 | |
---|---|
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 |
생성자 의 상세 |
---|
public Random()
public Random(long seed)
long
형의 배정을 사용해 난수 제네레이터를 작성합니다. 배정이란, 의사 난수 제네레이터의 내부 상태의 초기치입니다. 이 값은 next(int)
메소드에 의해 유지 관리됩니다.
호출 new Random(seed)
는 다음의 코드와 등가입니다.
Random rnd = new Random();
rnd.setSeed(seed);
seed
- 초기 배정setSeed(long)
메소드의 상세 |
---|
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
- 초기 배정protected int next(int bits)
next
의 일반 규약은,int
치를 돌려주어, 인수 bits
가 1
~ 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
- 랜덤 비트
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 인 경우public int nextInt()
int
형의 의사 난수를 돌려줍니다. nextInt
의 일반 규약에서는, 1 개의 int
형의 값이 의사 난수로서 생성되어 돌려주어집니다. 32 의 가능한 모든 int
치가 (거의) 균등인 확률로 생성됩니다.
Random
클래스에 의한 nextInt
메소드의 구현은, 다음과 동등합니다.
public int nextInt() {
return next(32);
}
int
형의 다음의 의사 난수치public int nextInt(int n)
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 가 정이 아닌 경우public long nextLong()
long
형의 다음의 의사 난수를 돌려줍니다. nextLong
의 일반 규약에서는, 1 개의 long
형의 값이 의사 난수로서 생성되어 돌려주어집니다.
Random
클래스에 의한 nextLong
메소드의 구현은, 다음과 동등합니다.
public long nextLong() {
return ((long) next(32) << 32) + next(32);
}
Random
클래스는 48 비트만을 포함한 배정을 사용하기 위해(때문에), 이 알고리즘은 가능한 모든 long
치의 일부 밖에 돌려주지 않습니다.
long
형의 다음의 의사 난수치public boolean nextBoolean()
boolean
형의 다음의 의사 난수를 돌려줍니다. nextBoolean
의 일반 규약에서는, 1 개의 boolean
형의 값이 의사 난수로서 생성되어 돌려주어집니다. 값 true
와 false
가 거의 균등인 확률로 생성됩니다.
Random
클래스에 의한 nextBoolean
메소드의 구현은, 다음과 동등합니다.
public boolean nextBoolean() {
return next(1) ! = 0;
}
boolean
형의 다음의 의사 난수치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
형의 다음의 의사 난수치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()
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.log
와 StrictMath.sqrt
의 호출만으로 2 개의 다른 값을 생성하는 것에 주의해 주세요.
0.0
, 표준 편차 1.0
의 Gauss ( 「정규」) 분포의,double
형의 다음의 의사 난수치
|
JavaTM Platform Standard Ed. 6 |
|||||||||
전의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.