public class Random extends Object implements Serializable
2つのRandom
インスタンスが同じシードで生成されている場合、それぞれに対して同じシーケンスでメソッド呼出しを行うと、同じシーケンスで数値が生成され返されます。この特性を保証するために、Random
クラスには固有のアルゴリズムが指定されています。Javaコードの絶対的な移植性の保持のために、Javaの実装はここに示されているRandom
クラスのアルゴリズムをすべて使用する必要があります。ただし、Random
クラスのサブクラスは、すべてのメソッドの一般規約に準拠したものであればほかのアルゴリズムも使用できます。
Random
クラスによって実装されるアルゴリズムでは、各呼出しで擬似乱数的に生成された最大32ビットを提供できるprotected
ユーティリティ・メソッドが使用されます。
多くのアプリケーションの場合、Math.random()
メソッドを使うほうが簡単です。
java.util.Random
のインスタンスはスレッド・セーフです。ただし、複数のスレッドで同じjava.util.Random
インスタンスを並行して使用すると、競合が発生してパフォーマンスが低下する可能性があります。マルチ・スレッド設計では、代わりにThreadLocalRandom
を使用することを検討してください。
java.util.Random
のインスタンスには安全な暗号化が施されていません。セキュリティ保護を必要とするアプリケーションで使用するために安全な暗号化の施された擬似乱数ジェネレータを取得するには、代わりにSecureRandom
を使用することを検討してください。
コンストラクタと説明 |
---|
Random()
新規乱数ジェネレータを作成します。
|
Random(long seed)
単一の
long 型のシードを使って、新しい乱数ジェネレータを作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
DoubleStream |
doubles()
0(含む)から1(含まない)までの擬似乱数
double 値を含む、事実上無制限のストリームを返します。 |
DoubleStream |
doubles(double randomNumberOrigin, double randomNumberBound)
指定された起点(含む)と境界(含まない)に準拠した擬似乱数
double 値を含む、事実上無制限のストリームを返します。 |
DoubleStream |
doubles(long streamSize)
0(含む)から1(含まない)までの擬似乱数
double 値を、指定されたstreamSize 数だけ生成するストリームを返します。 |
DoubleStream |
doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)
指定された起点(含む)と境界(含まない)に準拠した擬似乱数
double 値を、指定されたstreamSize 数だけ生成するストリームを返します。 |
IntStream |
ints()
擬似乱数
int 値を含む、事実上無制限のストリームを返します。 |
IntStream |
ints(int randomNumberOrigin, int randomNumberBound)
指定された起点(含む)と境界(含まない)に準拠した擬似乱数
int 値を含む、事実上無制限のストリームを返します。 |
IntStream |
ints(long streamSize)
擬似乱数
int 値を、指定されたstreamSize 数だけ生成するストリームを返します。 |
IntStream |
ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
指定された起点(含む)と境界(含まない)に準拠した擬似乱数
int 値を、指定されたstreamSize 数だけ生成するストリームを返します。 |
LongStream |
longs()
擬似乱数
long 値を含む、事実上無制限のストリームを返します。 |
LongStream |
longs(long streamSize)
擬似乱数
long 値を、指定されたstreamSize 数だけ生成するストリームを返します。 |
LongStream |
longs(long randomNumberOrigin, long randomNumberBound)
指定された起点(含む)と境界(含まない)に準拠した擬似乱数
long 値を含む、事実上無制限のストリームを返します。 |
LongStream |
longs(long streamSize, long randomNumberOrigin, long randomNumberBound)
指定された起点(含む)と境界(含まない)に準拠した擬似乱数
long を、指定されたstreamSize 数だけ生成するストリームを返します。 |
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 bound)
この乱数ジェネレータのシーケンスを使って、0から指定された値の範囲(0は含むが、その指定された値は含まない)で一様分布の
int 型の擬似乱数値を返します。 |
long |
nextLong()
この乱数ジェネレータのシーケンスを使って、一様分布の
long 型の次の擬似乱数値を返します。 |
void |
setSeed(long seed)
単一の
long 型のシードを使って、この乱数ジェネレータのシードを設定します。 |
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
(1と32を含む)の範囲の場合は、戻り値の多くの下位ビットが(ほぼ)独立に選択されたビット値になり、それぞれの値は(ほぼ)均等に0
または1
になります。Random
クラスによるnext
メソッドの実装では、シードを
(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
に原始的に更新し、次の値を返します。
(int)(seed >>> (48 - bits))
.
これは、D. H. Lehmerによって定義された、線形合同擬似乱数ジェネレータです。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
型の値が擬似乱数として生成されて返されます。232個のすべての可能なint
値が(ほぼ)均等な確率で生成されます。
Random
クラスによるnextInt
メソッドの実装は、次と同等です。
public int nextInt() {
return next(32);
}
int
型の次の擬似乱数値public int nextInt(int bound)
int
型の擬似乱数値を返します。nextInt
の一般規約では、指定された範囲内の1つのint
型の値が擬似乱数として生成されて返されます。bound
個のすべての可能なint
値が(ほぼ)均等な確率で生成されます。nextInt(int bound)
メソッドは、Random
クラスによって次のように実装されます。
public int nextInt(int bound) {
if (bound <= 0)
throw new IllegalArgumentException("bound must be positive");
if ((bound & -bound) == bound) // i.e., bound is a power of 2
return (int)((bound * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % bound;
} while (bits - val + (bound-1) < 0);
return val;
}
上記の説明で「ほぼ」という言葉を使用しているのは、nextメソッドが単にほとんど無関係に選択されたビットの中立的なソースだからです。ランダムに選択されたビットの完全なソースであるとすれば、示されたアルゴリズムは指定された範囲から完全な一貫性でint
型の値を選択することになります。
このアルゴリズムは多少扱いづらい面があります。このアルゴリズムは一様でない分布になる値を拒絶します(2^31がnで割れないことによる)。値が拒絶される確率はnによって異なります。最悪のケースはn=2^30+1で、この場合、拒絶の確率は1/2になり、ループが強制終了するまでの予想される反復回数は2回です。
このアルゴリズムは、nが2の累乗であるケースを特別に処理します。このアルゴリズムは、基になる擬似乱数ジェネレータから適切な数の上位ビットを返します。特別な処理がない場合は、適切な数の下位ビットが返されます。このクラスで実装されているような線形合同擬似乱数ジェネレータは、下位ビットの値のシーケンスで周期が短いことが知られています。そのため、この特別なケースでは、nが2の小さな累乗である場合、このメソッドの連続した呼出しによって返される値のシーケンスの長さが大幅に長くなります。
bound
- 上限(含まない)。正の値でなければならないbound
(含まない)の範囲で一様分布の、int
型の次の擬似乱数値IllegalArgumentException
- boundが正でない場合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.0fは含むが、1.0fは含まない)から(ほぼ)均等な確率で選択された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
クラスによる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;
}
}
polar methodを使用します - これは、G. E. P. Box、M. E. Muller、およびG. Marsaglia、Donald E. Knuth著『The Art of Computer Programming』第3巻『Seminumerical Algorithms』のセクション3.4.1のC、アルゴリズムPで説明されています。StrictMath.log
とStrictMath.sqrt
の1回ずつの呼び出しだけで2つの別々の値を生成することに注意してください。0.0
、標準偏差1.0
のガウス(「正規」)分布のdouble
型の次の擬似乱数値public IntStream ints(long streamSize)
streamSize
- 生成する値の数int
値のストリームIllegalArgumentException
- streamSize
が0未満の場合public IntStream ints()
int
値を含む、事実上無制限のストリームを返します。
メソッドnextInt()
呼び出しの結果と同様に、擬似乱数int
値が生成されます。
ints(Long.MAX_VALUE)
と同等であるように実装されます。int
値のストリームpublic IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
int
値を、指定されたstreamSize
数だけ生成するストリームを返します。
起点と境界を指定した次のメソッド呼び出しの結果と同様に、擬似乱数int
値が生成されます。
int nextInt(int origin, int bound) {
int n = bound - origin;
if (n > 0) {
return nextInt(n) + origin;
}
else { // range not representable as int
int r;
do {
r = nextInt();
} while (r < origin || r >= bound);
return r;
}
}
streamSize
- 生成する値の数randomNumberOrigin
- 各乱数値の起点(含む)randomNumberBound
- 各乱数値の境界(含まない)int
値のストリームIllegalArgumentException
- streamSize
が0未満の場合、またはrandomNumberOrigin
がrandomNumberBound
以上の場合public IntStream ints(int randomNumberOrigin, int randomNumberBound)
int
値を含む、事実上無制限のストリームを返します。
起点と境界を指定した次のメソッド呼び出しの結果と同様に、擬似乱数int
値が生成されます。
int nextInt(int origin, int bound) {
int n = bound - origin;
if (n > 0) {
return nextInt(n) + origin;
}
else { // range not representable as int
int r;
do {
r = nextInt();
} while (r < origin || r >= bound);
return r;
}
}
ints(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
と同等であるように実装されます。randomNumberOrigin
- 各乱数値の起点(含む)randomNumberBound
- 各乱数値の境界(含まない)int
値のストリームIllegalArgumentException
- randomNumberOrigin
がrandomNumberBound
以上の場合public LongStream longs(long streamSize)
streamSize
- 生成する値の数long
値のストリームIllegalArgumentException
- streamSize
が0未満の場合public LongStream longs()
long
値を含む、事実上無制限のストリームを返します。
メソッドnextLong()
呼び出しの結果と同様に、擬似乱数long
値が生成されます。
longs(Long.MAX_VALUE)
と同等であるように実装されます。long
値のストリームpublic LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound)
long
を、指定されたstreamSize
数だけ生成するストリームを返します。
起点と境界を指定した次のメソッド呼び出しの結果と同様に、擬似乱数long
値が生成されます。
long nextLong(long origin, long bound) {
long r = nextLong();
long n = bound - origin, m = n - 1;
if ((n & m) == 0L) // power of two
r = (r & m) + origin;
else if (n > 0L) { // reject over-represented candidates
for (long u = r >>> 1; // ensure nonnegative
u + m - (r = u % n) < 0L; // rejection check
u = nextLong() >>> 1) // retry
;
r += origin;
}
else { // range not representable as long
while (r < origin || r >= bound)
r = nextLong();
}
return r;
}
streamSize
- 生成する値の数randomNumberOrigin
- 各乱数値の起点(含む)randomNumberBound
- 各乱数値の境界(含まない)long
値のストリームIllegalArgumentException
- streamSize
が0未満の場合、またはrandomNumberOrigin
がrandomNumberBound
以上の場合public LongStream longs(long randomNumberOrigin, long randomNumberBound)
long
値を含む、事実上無制限のストリームを返します。
起点と境界を指定した次のメソッド呼び出しの結果と同様に、擬似乱数long
値が生成されます。
long nextLong(long origin, long bound) {
long r = nextLong();
long n = bound - origin, m = n - 1;
if ((n & m) == 0L) // power of two
r = (r & m) + origin;
else if (n > 0L) { // reject over-represented candidates
for (long u = r >>> 1; // ensure nonnegative
u + m - (r = u % n) < 0L; // rejection check
u = nextLong() >>> 1) // retry
;
r += origin;
}
else { // range not representable as long
while (r < origin || r >= bound)
r = nextLong();
}
return r;
}
longs(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
と同等であるように実装されます。randomNumberOrigin
- 各乱数値の起点(含む)randomNumberBound
- 各乱数値の境界(含まない)long
値のストリームIllegalArgumentException
- randomNumberOrigin
がrandomNumberBound
以上の場合public DoubleStream doubles(long streamSize)
double
値を、指定されたstreamSize
数だけ生成するストリームを返します。
メソッドnextDouble()
呼び出しの結果と同様に、擬似乱数double
値が生成されます。
streamSize
- 生成する値の数double
値のストリームIllegalArgumentException
- streamSize
が0未満の場合public DoubleStream doubles()
double
値を含む、事実上無制限のストリームを返します。
メソッドnextDouble()
呼び出しの結果と同様に、擬似乱数double
値が生成されます。
doubles(Long.MAX_VALUE)
と同等であるように実装されます。double
値のストリームpublic DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)
double
値を、指定されたstreamSize
数だけ生成するストリームを返します。
起点と境界を指定した次のメソッド呼び出しの結果と同様に、擬似乱数double
値が生成されます。
double nextDouble(double origin, double bound) {
double r = nextDouble();
r = r * (bound - origin) + origin;
if (r >= bound) // correct for rounding
r = Math.nextDown(bound);
return r;
}
streamSize
- 生成する値の数randomNumberOrigin
- 各乱数値の起点(含む)randomNumberBound
- 各乱数値の境界(含まない)double
値のストリームIllegalArgumentException
- streamSize
が0未満の場合IllegalArgumentException
- randomNumberOrigin
がrandomNumberBound
以上の場合public DoubleStream doubles(double randomNumberOrigin, double randomNumberBound)
double
値を含む、事実上無制限のストリームを返します。
起点と境界を指定した次のメソッド呼び出しの結果と同様に、擬似乱数double
値が生成されます。
double nextDouble(double origin, double bound) {
double r = nextDouble();
r = r * (bound - origin) + origin;
if (r >= bound) // correct for rounding
r = Math.nextDown(bound);
return r;
}
doubles(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)
と同等であるように実装されます。randomNumberOrigin
- 各乱数値の起点(含む)randomNumberBound
- 各乱数値の境界(含まない)double
値のストリームIllegalArgumentException
- randomNumberOrigin
がrandomNumberBound
以上の場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.