|
Unofficial "CLDC 1.1 + MIDP 2.0" API Reference. (日本語版) |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.util.Random
public class Random
48 ビットのシードと線形合同擬似乱数アルゴリズムを使用して擬似乱数を生成します。 この擬似乱数の生成についての詳細は Donald Knuth 著“The Art of Computer Programming, Volume 2”の 3.2.1 に記載されています。
同じ値をシードとして生成されたインスタンスに対して、それぞれ同じメソッドを同じ順序で呼び出して乱数を取得した場合、それぞれのインスタンスはまったく同じ値を返します。
この法則を保証するため、固有のアルゴリズムを Random
クラスは実装しています。
Java コードの絶対的な移植性を確保するため、全ての実装(インプリメンテーション)は、この Random
クラスの実装に際して同様のアルゴリズムを採用しなければなりません。
アプリケーションにおいて Random
クラスのサブクラスを作成する場合、next(int)
メソッドをオーバーライドして独自のアルゴリズムを実装することもできます。
コンストラクタの概要 | |
---|---|
Random()
現在の日時をシードに持つオブジェクトを構築します。 |
|
Random(long seed)
渡されたシードを持つオブジェクトを構築します。 |
メソッドの概要 | |
---|---|
protected int |
next(int bitlen)
指定されたビット長の擬似乱数を生成します。 |
double |
nextDouble()
この擬似乱数生成器のシーケンスから 0.0 〜 0.1 までの間の、一様に分布する double 値を返します。 |
float |
nextFloat()
この擬似乱数生成器のシーケンスから 0.0 〜 0.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 |
コンストラクタの詳細 |
---|
public Random()
public Random(long seed)
seed
- 設定するシード値を渡します。setSeed(long)
メソッドの詳細 |
---|
public void setSeed(long seed)
渡された long
型の値をシードとして設定します。
このメソッドの一般規約ではパラメータ seed
を使用してシードを作成した状態となるように、保持しているシードを変更します。
実際の Random
クラスでの実装は、
public synchronized void setSeed(long seed) { this.seed = (seed ^ 0x5deece66dl) & 0xffffffffffffl; }
とされています。このように使用するビット数は48ビットに制限しています。
サブクラスを作成し、このメソッドをオーバーライドすることによってシード値として渡された64ビット全ての有効とするように変更することも可能です。
seed
- 設定するシード値を渡します。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 に記載されています。
public int nextInt()
next(int)
メソッドを呼び出して、int
型の擬似乱数を返します。
生成される値はほぼ均等な確率で int
値の範囲内に分散した値となります。
実際の Random
クラスでの実装は、
public int nextInt() { return next(32); }
とされています。
public long nextLong()
next(int)
メソッドを呼び出して、long
型の擬似乱数を返します。
生成される値はほぼ均等な確率で long
値の範囲内に分散した値となります。
実際の Random
クラスでの実装は、
public long nextLong() { return ((long) next(32) << 32) + next(32); }
とされています。
public int nextInt(int n)
この乱数発生器のシーケンスから得られる 0
(を含む)から指定された値(を含まない)までの間の一様に分布している擬似乱数を int
値で返します。
nextInt
の一般的な約定は、指定された範囲の1つの int
値を擬似乱数にて作成し、返すことです。
全ての可能な n
の int
値は(概ね)等しい確率で作成します。
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
値を選択します。
このアルゴリズムは若干扱いにくい面があります。
それは(231 が n
で分割できないという事実により)偏在をもたらす値を拒絶します。
拒絶される値の確率は n
に依存します。
最悪条件は n=230
です。そしてループが終わる前に反復として予想される数は 2
です。このため廃棄される確率は 1/2
です。
このアルゴリズムは特に n
が2の乗数であるケースを扱います。
それは基本的な擬似乱数生成器から上位のビットの適度な数を返します。
特別な処理を行わないとき、下位のビットの適度な数を返します。
このクラスによって実装されたものなどの、直線的なふさわしい擬似乱数生成器がそれらの下位のビットの値のシーケンスを短期に持つことが知られています。
したがって、この特別なケースでは n
が 2
の乗数であれば、このメソッドへの連続した呼び出しによって返される値のシーケンスの長さをかなり増加させます。
n
- 乱数を返す際の限界値を渡します。
その値は正数でなければなりません。
0
(を含む)から n
(を除外する)までの間に一様に分布する int
値を返します。
IllegalArgumentException
- n
が正数ではない場合に throw します。public float nextFloat()
この擬似乱数生成器のシーケンスから 0.0
〜 0.1
までの間の、一様に分布する float
値を返します。
nextFloat
の一般的な約定は、0.0f
(を含む)から 1.0f
(を含まない)の間の(概ね)一様な選択を行い、1つの float
値を擬似乱数にて作成し、返すことです。
全ての可能な m x 2-24 の float
値は、m が正の整数による 2-24 までであり、(概ね)等しい確率で生成します。
nextFloat
メソッドは Random
クラスにおいて以下のように実装されます:
public float nextFloat() { return next(24) / ((float)(1 << 24)); }
単に next
メソッドが独自に選択したビットの偏りのないソースであるため、直接的な表現を避ける"概ね"を、以上の説明文で使用しています。
それが手当たり次第に選択したビットの完全なソースであれば、示されたアルゴリズムは完全な一様性に従い、float
値を選択します。
0.0
(を含む)から 1.0
(を除外する)までの間に一様に分布する float
値を返します。public double nextDouble()
この擬似乱数生成器のシーケンスから 0.0
〜 0.1
までの間の、一様に分布する double
値を返します。
nextDouble
の一般的な約定は、0.0d
(を含む)から 1.0d
(を含まない)の間の(概ね)一様な選択を行い、1つの double
値を擬似乱数にて作成し、返すことです。
全ての可能な m x 2-53 の double
値は、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
値を返します。
|
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 部分は同仕様の範囲外であるため、まったく参考とはしていません。 ※仕様書のライセンス上、問題は無いと考えておりますが、万が一問題があるとお考えの関係者の方がいらっしゃいましたらメールにて連絡をいただけると幸いに存じます(第一言語に日本語、第二言語に英語を希望しますが、返信は基本的に日本語で行います)。 |