|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.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 のガウス (「正規」) 分布の、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)
に原始的に更新し、nextGaussian()
によって使用される haveNextNextGaussian
フラグをクリアーします。
Random
クラスによる setSeed
の実装は、指定されたシードの 48 ビットだけしか使用していません。しかし一般に、オーバーライドするメソッドは、long
引数の 64 ビットすべてをシード値として使用できます。
seed
- 初期シードprotected int next(int bits)
next
の一般規約は、int
値を返し、引数 bits
が 1
〜 32
(これを含む) の場合は戻り値のそれだけの個数の下位ビットがほぼ独立に選択されたビット値になる、というものです。値が 0
または 1
になる確率は、どのビットもほぼ等しくなります。Random
クラスによる next
メソッドの実装では、シードを
(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
に原始的に更新し、次の値を返します。
(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
のガウス (「正規」) 分布の、double
型の次の擬似乱数値を返します。
nextGaussian
の一般規約では、平均 0.0
、標準偏差 1.0
のほぼ通常の正規分布から選択された 1 つの double
値が、擬似乱数として生成されて返されます。
Random
クラスによるメソッド @code nextGaussian} の実装は、次の、スレッドに対して安全なバージョンと同等です。
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
のガウス (「正規」) 分布の、double
型の次の擬似乱数値
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。