25

Java には静的クラス Math があります。オブジェクトを作成する必要がないため、静的です。もう1つはランダムクラスです。そのインスタンスを作成する必要がないのに、なぜそれも静的ではないのでしょうか? 私のクラスでは、乱数を生成するためにすべてのクラスでフィールド rand を作成する必要があるときに、乱数を使用することがよくあります。では、なぜ静的ではないのでしょうか。

4

4 に答える 4

30

生成される値は完全にランダムではなく、単なる疑似ランダム シーケンスであるため、Random クラスには、そのシーケンス内の位置を含む状態があります。

これは、2 つのインスタンスを同じシードで初期化することによって実証できます。

Random a = new Random(123);
Random b = new Random(123);
for (int i = 0; i < 5; i++) {
    System.out.println(a.nextInt() + "," + b.nextInt());
}

出力

-1188957731,-1188957731
1018954901,1018954901
-39088943,-39088943
1295249578,1295249578
1087885590,1087885590

デフォルトのコンストラクター Random() で作成すると、シードは現在のナノ秒単位の時間 + 静的カウンターに基づいて初期化されます。つまり、異なるインスタンスは異なるシーケンスを持つ可能性が非常に高くなります。

于 2013-01-20T12:40:51.940 に答える
14

乱数ジェネレーターには状態があるため、インスタンスを作成する必要があります。具体的には、疑似乱数列の現在位置を制御する状態。

複数の独立したジェネレーター (状態を共有しない) が必要な場合は、個別のインスタンスが必要です。

于 2013-01-20T12:40:24.013 に答える
5

それはすべて種子についてです。ご存じのとおり、実際の乱数についてではなく、疑似乱数について話します。最初の数がわかれば、残りの数を計算できます。これが、「シード」と呼ばれるものを使用する理由です。の各オブジェクトにRandomは異なるシードがあります。static の場合Random、2 つの異なるシードを持つことはできません。setSeed()メソッドはすべての乱数ジェネレーターに影響を与えることに注意してください(多くの場合、1 つだけを変更したい場合があります)。

于 2013-01-20T12:42:02.127 に答える
4

その理由は、複数の独立した乱数ジェネレーターが必要になる場合があるためです。これは、 のインスタンスをいくつか持つことによって実現されますRandom

于 2013-01-20T12:40:37.377 に答える