JavaTM 2
Platform
Std. Ed. v1.4.0

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 2』の 3.2.1 を参照してください。

2 つの Random インスタンスが同じシードで生成され、それぞれに対して同じメソッド呼び出しのシーケンスが生成される場合は、同じ番号のシーケンスが生成され返されます。このプロパティを保証するために、固有のアルゴリズムが Random クラスに指定されます。Java コードの絶対的な移植性の保持のために、Java の実装はここに示されている Random クラスのアルゴリズムをすべて使用する必要があります。ただし、Random クラスのサブクラスは、すべてのメソッドの一般規約に準拠したものであればほかのアルゴリズムも使用できます。

Random クラスによって実装されるアルゴリズムでは、各呼び出しで擬似乱数的に生成された最大 32 ビットを提供できる protected ユーティリティメソッドが使用されます。

ほとんどのアプリケーションでは、クラス Mathrandom メソッドを使う方が簡単です。

導入されたバージョン:
JDK1.0
関連項目:
Math.random(), 直列化された形式

コンストラクタの概要
Random()
          新しい乱数ジェネレータを作成します。
Random(long seed)
          long 型のシードを使って乱数ジェネレータを作成します。
 
メソッドの概要
protected  int next(int bits)
          次の擬似乱数を生成します。
 boolean nextBoolean()
          乱数ジェネレータのシーケンスを使って、一様分布の boolean 型の次の擬似乱数を返します。
 void nextBytes(byte[] bytes)
          ランダムバイトを生成し、ユーザ指定のバイト配列に配置します。
 double nextDouble()
          乱数ジェネレータのシーケンスを使って、0.01.0 の範囲で一様分布の double 型の擬似乱数を返します。
 float nextFloat()
          乱数ジェネレータのシーケンスを使って、0.01.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()
新しい乱数ジェネレータを作成します。シードは現在時刻をもとに初期化されます。
 public Random() { this(System.currentTimeMillis()); }
同じミリ秒内に作成された 2 つの Random オブジェクトには、同一シーケンスの乱数があります。

関連項目:
System.currentTimeMillis()

Random

public Random(long seed)
long 型のシードを使って乱数ジェネレータを作成します。
 public Random(long seed) { setSeed(seed); }
擬似乱数ジェネレータの状態を保持するために next メソッドによって使用されます。

パラメータ:
seed - 初期シード
関連項目:
setSeed(long)
メソッドの詳細

setSeed

public void setSeed(long seed)
単一の long 型のシードを使って、乱数ジェネレータのシードを設定します。setSeed の一般規約では、シードとして引数 seed を使って作成されたばかりの状態と同じになるように、この乱数ジェネレータオブジェクトの状態を変更します。setSeed メソッドは Random クラスによって次のように実装されます。
 synchronized public void setSeed(long seed) {
       this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
       haveNextNextGaussian = false;
 }
Random クラスによる setSeed の実装は、指定されたシードの 48 ビットだけを使用していますが、一般には、メソッドは変更することにより、シード値として long 引数の 64 ビットすべてを使用することもできます。

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

next

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

next の一般規約では、int 型の値を返し、引数 bits が 132 (1 と 32 を含む) の範囲の場合は、戻り値の多くの下位ビットが (ほぼ) 独立に選択されたビット値になり、それぞれの値は (ほぼ) 均等に 0 または 1 になります。next メソッドは Random クラスによって次のように実装されます。

 synchronized protected int next(int bits) {
       seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
       return (int)(seed >>> (48 - bits));
 }
これは、D. H. Lehmer によって定義された、線形合同擬似乱数ジェネレータです。詳細は Donald Knuth 著『The Art of Computer Programming, Volume 2: Seminumerical Algorithms』の 3.2.1 を参照してください。

パラメータ:
bits - ランダムビット
戻り値:
乱数ジェネレータのシーケンスを使って生成された、次の擬似乱数
導入されたバージョン:
JDK1.1

nextBytes

public void nextBytes(byte[] bytes)
ランダムバイトを生成し、ユーザ指定のバイト配列に配置します。作成されるランダムバイトの数は、バイト配列の長さと等しくなります。

パラメータ:
bytes - ランダム配列を配置する null 以外のバイト配列
導入されたバージョン:
JDK1.1

nextInt

public int nextInt()
乱数ジェネレータのシーケンスを使って、一様分布の int 型の擬似乱数を返します。nextInt の一般規約では、1 つの int 型の値が擬似乱数として生成されて返されます。232 の可能なすべての int 値が (ほぼ) 均等な確率で生成されます。nextInt メソッドは Random クラスによって次のように実装されます。
 public int nextInt() {  return next(32); }

戻り値:
乱数ジェネレータのシーケンスを使って生成された等分布の int 型擬似乱数

nextInt

public int nextInt(int n)
乱数ジェネレータのシーケンスを使って、0 から指定された値の範囲 (0 は含むが、その指定された値は含まない) で一様分布の int 型の擬似乱数を返します。nextInt の一般規約では、指定された範囲内の 1 つの int 値が擬似乱数として生成されて返されます。n 個の可能なすべての int 値が (ほぼ) 均等な確率で生成されます。nextInt(int n) メソッドは Random クラスによって次のように実装されます。
 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 の範囲 (0 は含むが、n は含まない) で一様分布の int 型擬似乱数
例外:
IllegalArgumentException - n が負の値の場合
導入されたバージョン:
1.2

nextLong

public long nextLong()
乱数ジェネレータのシーケンスを使って、一様分布の long 型の次の擬似乱数を返します。nextLong の一般規約では、1 つの long 型の値が擬似乱数として生成されて返されます。264 の可能なすべての long 値が (ほぼ) 均等な確率で生成されます。nextLong メソッドは Random クラスによって次のように実装されます。
 public long nextLong() {
       return ((long)next(32) << 32) + next(32);
 }

戻り値:
乱数ジェネレータのシーケンスを使って生成された、一様分布の long 型の次の擬似乱数

nextBoolean

public boolean nextBoolean()
乱数ジェネレータのシーケンスを使って、一様分布の boolean 型の次の擬似乱数を返します。nextBoolean の一般規約では、1 つの boolean 型の値が擬似乱数として生成されて返されます。truefalse の値が (ほぼ) 等しい確率で生成されます。nextBoolean メソッドは、Random クラスによって次のように実装されます。
 public boolean nextBoolean() {return next(1) != 0;}

戻り値:
乱数ジェネレータのシーケンスを使って生成された等分布の boolean 型擬似乱数
導入されたバージョン:
1.2

nextFloat

public float nextFloat()
乱数ジェネレータのシーケンスを使って、0.01.0 の範囲で一様分布の float 型の擬似乱数を返します。

nextFloat の一般規約では、0.0f1.0f の範囲 (0.0f は含むが、1.0f は含まない) から (ほぼ) 均等な確率で選択された 1 つの float 値が擬似乱数として生成されて返されます。m x 2-24 という形式 (m は 224 未満の正の整数) の 224 の可能なすべての float 値が (ほぼ) 均等な確率で生成されます。nextFloat メソッドは Random クラスによって次のように実装されます。

 public float nextFloat() {
      return next(24) / ((float)(1 << 24));
 }
上記の説明で「ほぼ」という言葉を使用しているのは、next メソッドが単にほとんど無関係に選択されたビットの中立的なソースだからです。ランダムに選択されたビットの完全なソースであるとすれば、示されたアルゴリズムは指定された範囲から完全な一貫性で float 型の値を選択することになります。

[以前のバージョンの Java では、結果は次のように誤って計算されました。

 return next(30) / ((float)(1 << 30));
これでもある程度等しく思われますが、実際には、浮動小数点数の丸めでのバイアスのために多少のばらつきが生じるので、有効数字の下位ビットが、1 よりも 0 になることが多くなりがちでした。}

戻り値:
乱数ジェネレータのシーケンスを使った、0.01.0 の範囲で一様分布の float 型の次の擬似乱数

nextDouble

public double nextDouble()
乱数ジェネレータのシーケンスを使って、0.01.0 の範囲で一様分布の double 型の擬似乱数を返します。

nextDouble の一般規約では、0.0d1.0d の範囲から (ほぼ) 均等な確率で選択された 1 つの double 値が擬似乱数として生成されて返されます。m x 2-53 という形式 (m は 253 未満の正の整数) の 253 の可能なすべての float 値が (ほぼ) 均等な確率で生成されます。nextDouble メソッドは Random クラスによって次のように実装されます。

 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.01.0 の範囲で一様分布の double 型の次の擬似乱数

nextGaussian

public double nextGaussian()
乱数ジェネレータのシーケンスを使って、平均 0.0、標準偏差 1.0 のガウス (「正規」) 分布の double 型の擬似乱数を返します。

nextGaussian の一般規約では、平均 0.0、標準偏差 1.0 の (ほぼ) 通常の正規分布から選択された、1 つの double 型の値が擬似乱数として生成されて返されます。nextGaussian メソッドは Random クラスによって次のように実装されます。

 synchronized 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 = Math.sqrt(-2 * Math.log(s)/s);
            nextNextGaussian = v2 * multiplier;
            haveNextNextGaussian = true;
            return v1 * multiplier;
    }
 }
これは、Donald E. Knuth 著『The Art of Computer Programming, Volume 2: Seminumerical Algorithms』の 3.4.1 の C、アルゴリズム P で説明されている、G. E. P. Box、M. E. Muller、および G. Marsaglia の「polar method」を使用します。Math.logMath.sqrt の呼び出しだけで 2 つの別々の値を生成することに注意してください。

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

JavaTM 2
Platform
Std. Ed. v1.4.0

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

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.