Unofficial
"CLDC 1.1
+ MIDP 2.0"
API Reference.
(日本語版)

java.util
クラス Random

java.lang.Object
  上位を拡張 java.util.Random

public class Random
extends Object

48 ビットのシードと線形合同擬似乱数アルゴリズムを使用して擬似乱数を生成します。 この擬似乱数の生成についての詳細は Donald Knuth 著“The Art of Computer Programming, Volume 2”の 3.2.1 に記載されています。

同じ値をシードとして生成されたインスタンスに対して、それぞれ同じメソッドを同じ順序で呼び出して乱数を取得した場合、それぞれのインスタンスはまったく同じ値を返します。 この法則を保証するため、固有のアルゴリズムを Random クラスは実装しています。 Java コードの絶対的な移植性を確保するため、全ての実装(インプリメンテーション)は、この Random クラスの実装に際して同様のアルゴリズムを採用しなければなりません。

アプリケーションにおいて Random クラスのサブクラスを作成する場合、next(int) メソッドをオーバーライドして独自のアルゴリズムを実装することもできます。

導入されたバージョン:
CLDC 1.0

コンストラクタの概要
Random()
          現在の日時をシードに持つオブジェクトを構築します。
Random(long seed)
          渡されたシードを持つオブジェクトを構築します。
 
メソッドの概要
protected  int next(int bitlen)
          指定されたビット長の擬似乱数を生成します。
 double nextDouble()
          この擬似乱数生成器のシーケンスから 0.00.1 までの間の、一様に分布する double 値を返します。
 float nextFloat()
          この擬似乱数生成器のシーケンスから 0.00.1 までの間の、一様に分布する float 値を返します。
 int nextInt()
          next(int) メソッドを呼び出して、int 型の擬似乱数を返します。
 int nextInt(int n)
          この乱数発生器のシーケンスから得られる 0(を含む)から指定された値(を含まない)までの間の一様に分布している擬似乱数を int 値で返します。
 long nextLong()
          next(int) メソッドを呼び出して、long 型の擬似乱数を返します。
 void setSeed(long seed)
          渡された long 型の値をシードとして設定します。
 
クラス java.lang.Object から継承されたメソッド
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

Random

public Random()
現在の日時をシードに持つオブジェクトを構築します。


Random

public Random(long seed)
渡されたシードを持つオブジェクトを構築します。

パラメータ:
seed - 設定するシード値を渡します。
関連項目:
setSeed(long)
メソッドの詳細

setSeed

public void setSeed(long seed)

渡された long 型の値をシードとして設定します。 このメソッドの一般規約ではパラメータ seed を使用してシードを作成した状態となるように、保持しているシードを変更します。 実際の Random クラスでの実装は、

 public synchronized void setSeed(long seed)
 {
     this.seed = (seed ^ 0x5deece66dl) & 0xffffffffffffl;
 }

とされています。このように使用するビット数は48ビットに制限しています。

サブクラスを作成し、このメソッドをオーバーライドすることによってシード値として渡された64ビット全ての有効とするように変更することも可能です。

パラメータ:
seed - 設定するシード値を渡します。

next

protected int next(int bitlen)

指定されたビット長の擬似乱数を生成します。 このメソッドは他の乱数生成メソッドから内部的に呼び出されます。 標準で実装されている以外のアルゴリズムで乱数を生成する場合は、サブクラスでこのメソッドをオーバーライドします。

このメソッドの一般規約では1〜32(これには1と32を含む)ビットの間の擬似乱数を生成し、int 型で返します。 結果として生成される個々のビットは必要十分に均等に近く0あるいは1が選択されます。

実際の Random クラスでの実装は、

 protected synchronized int next(int bitlen)
 {
     seed = (seed * 0x5deece66dl + 0x0bl) & & 0xffffffffffffl;
     return (int) (seed >>> (48 - bitlen);
 }

とされています。

これは D.H.Lehmer によって定義された、線形合同擬似乱数アルゴリズムを使用したものです。 アルゴリズムの詳細については Donald Knuth 著“The Art of Computer Programming, Volume 2: Seminumerical Algorithms”の 3.2.1 に記載されています。

戻り値:
生成された擬似乱数を返します。

nextInt

public int nextInt()

next(int) メソッドを呼び出して、int 型の擬似乱数を返します。 生成される値はほぼ均等な確率で int 値の範囲内に分散した値となります。

実際の Random クラスでの実装は、

 public int nextInt()
 {
     return next(32);
 }

とされています。

戻り値:
生成された擬似乱数を返します。

nextLong

public long nextLong()

next(int) メソッドを呼び出して、long 型の擬似乱数を返します。 生成される値はほぼ均等な確率で long 値の範囲内に分散した値となります。

実際の Random クラスでの実装は、

 public long nextLong()
 {
     return ((long) next(32) << 32) + next(32);
 }

とされています。

戻り値:
生成された擬似乱数を返します。

nextInt

public int nextInt(int n)

この乱数発生器のシーケンスから得られる 0(を含む)から指定された値(を含まない)までの間の一様に分布している擬似乱数を int 値で返します。 nextInt の一般的な約定は、指定された範囲の1つの int 値を擬似乱数にて作成し、返すことです。 全ての可能な nint 値は(概ね)等しい確率で作成します。 nextInt(int n) メソッドは Random クラスにおいて以下のように実装されます:

 public int nextInt(int n) {
     if (n<=0)
         throw new IllegalArgumentException("nは正数でなければなりません。");

     if ((n & -n) == n)  // すなわち2のn乗
         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 値を選択します。

このアルゴリズムは若干扱いにくい面があります。 それは(231n で分割できないという事実により)偏在をもたらす値を拒絶します。 拒絶される値の確率は n に依存します。 最悪条件は n=230 です。そしてループが終わる前に反復として予想される数は 2 です。このため廃棄される確率は 1/2 です。

このアルゴリズムは特に n が2の乗数であるケースを扱います。 それは基本的な擬似乱数生成器から上位のビットの適度な数を返します。 特別な処理を行わないとき、下位のビットの適度な数を返します。 このクラスによって実装されたものなどの、直線的なふさわしい擬似乱数生成器がそれらの下位のビットの値のシーケンスを短期に持つことが知られています。 したがって、この特別なケースでは n2 の乗数であれば、このメソッドへの連続した呼び出しによって返される値のシーケンスの長さをかなり増加させます。

パラメータ:
n - 乱数を返す際の限界値を渡します。 その値は正数でなければなりません。
戻り値:
擬似乱数によって、0(を含む)から n(を除外する)までの間に一様に分布する int 値を返します。
例外:
IllegalArgumentException - n が正数ではない場合に throw します。
導入されたバージョン:
CLDC 1.1

nextFloat

public float nextFloat()

この擬似乱数生成器のシーケンスから 0.00.1 までの間の、一様に分布する float 値を返します。

nextFloat の一般的な約定は、0.0f(を含む)から 1.0f(を含まない)の間の(概ね)一様な選択を行い、1つの float 値を擬似乱数にて作成し、返すことです。 全ての可能な m x 2-24float 値は、m が正の整数による 2-24 までであり、(概ね)等しい確率で生成します。 nextFloat メソッドは Random クラスにおいて以下のように実装されます:

 public float nextFloat() {
      return next(24) / ((float)(1 << 24));
 }

単に next メソッドが独自に選択したビットの偏りのないソースであるため、直接的な表現を避ける"概ね"を、以上の説明文で使用しています。 それが手当たり次第に選択したビットの完全なソースであれば、示されたアルゴリズムは完全な一様性に従い、float 値を選択します。

戻り値:
擬似乱数によって、0.0(を含む)から 1.0(を除外する)までの間に一様に分布する float 値を返します。
導入されたバージョン:
CLDC 1.1

nextDouble

public double nextDouble()

この擬似乱数生成器のシーケンスから 0.00.1 までの間の、一様に分布する double 値を返します。

nextDouble の一般的な約定は、0.0d(を含む)から 1.0d(を含まない)の間の(概ね)一様な選択を行い、1つの double 値を擬似乱数にて作成し、返すことです。 全ての可能な m x 2-53double 値は、m が正の整数による 2-53 までであり、(概ね)等しい確率で生成します。 nextDouble メソッドは Random クラスにおいて以下のように実装されます:

 public double nextDouble() {
      return (((long)next(26) << 27)  next(27)) / (double)(1L << 53);
 }

単に next メソッドが独自に選択したビットの偏りのないソースであるため、直接的な表現を避ける"概ね"を、以上の説明文で使用しています。 それが手当たり次第に選択したビットの完全なソースであれば、示されたアルゴリズムは完全な一様性に従い、double 値を選択します。

戻り値:
擬似乱数によって、0.0(を含む)から 1.0(を除外する)までの間に一様に分布する double 値を返します。
導入されたバージョン:
CLDC 1.1

Unofficial
"CLDC 1.1
+ MIDP 2.0"
API Reference.
(日本語版)

公式仕様書原文の著作権表記等(※):

Mobile Information Device Profile Specification ("Specification")
Version: 2.0
Status: FCS
Release: November 5, 2002

Copyright 2002 Sun Microsystems, Inc. and Motorola, Inc.
All rights reserved.
※ただしこの API リファレンスは英語仕様を一語一句正確に翻訳したものではなく、一度私が英語の仕様原文を読んだ上で元の意味と構造をなるべく保つように書き起こしたものです。このため一部は完全に異なる説明となっています。また CLDC 1.1 部分は同仕様の範囲外であるため、まったく参考とはしていません。

※仕様書のライセンス上、問題は無いと考えておりますが、万が一問題があるとお考えの関係者の方がいらっしゃいましたらメールにて連絡をいただけると幸いに存じます(第一言語に日本語、第二言語に英語を希望しますが、返信は基本的に日本語で行います)。

この API リファレンスは仕様書の日本語版という位置づけでは作成していませんし、仕様書ほど厳格でもありません。MUST、SHOULD、MAY などの仕様の条件を強調する文を維持していません(反映すらしていない個所もあります)。仮想マシンおよび MIDP の実装のために使用することは避けてください。そのような用途には必ず公式仕様書原文そのものを用いるべきです。
この API リファレンスに記載されている内容は"さかきけい"が Sun Microsystems, Inc や Motorola, Inc、Java Community Process が公開している各種公式資料を元に、独自に調査・編集したものであり、Sun Microsystems, Inc や Motorola, Inc、Java Community Process 等とは一切関係ありません。したがってこの API リファレンスに関する問い合わせを関係各社等に対して行うことを固く禁じます。
また、記載された内容には既知か否かに関らず誤りが含まれる可能性があり、一切保証はありません。本 API リファレンスを使用した結果、不利益が生じたとしても"さかきけい"は一切の責任を負いません。
許可無く公開/非公開および Internet/Intranet/LAN を問わず他サイトに転載すること、複写および複製すること、ローカル・ファイル等に保存することを禁じます。


Copyright© 2001-2002,2005-2009,2011 by KEI SAKAKI.
ALL RIGHTS RESERVED.
無断転載を禁じます。

Unofficial "CLDC 1.0 + MIDP 1.0" API Reference はこちらです。