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 のガウス (「正規」) 分布の、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)
に原始的に更新し、nextGaussian() によって使用される haveNextNextGaussian フラグをクリアーします。  

Random クラスによる setSeed の実装は、指定されたシードの 48 ビットだけしか使用していません。しかし一般に、オーバーライドするメソッドは、long 引数の 64 ビットすべてをシード値として使用できます。

パラメータ:
seed - 初期シード

next

protected int next(int bits)
次の擬似乱数を生成します。このメソッドは、ほかのすべてのメソッドによって使われるので、サブクラスによって上書きされます。  

next の一般規約は、int 値を返し、引数 bits132 (これを含む) の場合は戻り値のそれだけの個数の下位ビットがほぼ独立に選択されたビット値になる、というものです。値が 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 - ランダムビット
戻り値:
この乱数ジェネレータのシーケンスに基づく次の擬似乱数値
導入されたバージョン:
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 のガウス (「正規」) 分布の、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.logStrictMath.sqrt の呼び出しだけで 2 つの別々の値を生成することに注意してください。

戻り値:
乱数ジェネレータのシーケンスに基づく、平均 0.0、標準偏差 1.0 のガウス (「正規」) 分布の、double 型の次の擬似乱数値

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。