Random
Java でクラスを使用する好ましい方法は何ですか?
a) の 1 つのオブジェクトを作成し、Random
それを何度も使用する
b)Random
ランダム値が必要になるたびに新しいオブジェクトを作成します
欠点と利点は何ですか?
技術的には、クラスによって行われる保証は、単一のインスタンスが値の疑似ランダムストリームを生成することです。あなたの方法(b)では、結果として得られる値のストリームがランダム性の同じ統計的定義を満たすという明示的な保証はありません。したがって、真の統計的ランダムネスを気にする場合は、(a)が推奨されます。
(b)にはあまりメリットがありません。Randomの単一インスタンスへの参照を保持する必要がないことを意味すると思いますが、シングルトンクラスでそれを行うのは簡単です。一般的に、パフォーマンス上の理由から多くの新しいオブジェクトを作成することには注意が必要ですが、影響を測定して、それが許容できるかどうかを判断できます。
したがって、これらのオプションの間で、私は通常(a)を好みます。
複数の長寿命インスタンスを使用するという3番目のオプションがわかります。Random
複数のスレッドがあり、それぞれが独自のオブジェクトを使用するようにしたい場合は、これを行うことができます。(javadocからは、複数のスレッドが単一のオブジェクトを呼び出すことの意味が何であるかはわかりません。)
ループ内で乱数を繰り返し生成する必要がある場合は、Random
オブジェクトを作成し、それを使用して数値を生成できます。Random
乱数ごとに新しいオブジェクトを作成する理由はほとんどありません。これを行うと、プログラムのパフォーマンスが不必要に低下する可能性があります。
たまに乱数を生成する場合は、乱数を生成するたびに新しいRandomオブジェクトを作成しても問題はありません。物を置いておくのRandom
もOKです。これは上記の場合と混同される可能性があることに注意してください。たとえば、ゲームの開始時に多くの乱数を生成できますが、ゲーム中にランダムなことは起こりません。
Random
Java仮想マシンでは、プログラムの存続期間を通じてオブジェクトを保持しないことで節約できるメモリ使用量について少し疑問があります。一方、Random
オブジェクトが常に再作成される場合、パフォーマンスは確実に低下します。プログラムの動作に応じて、オーバーヘッドが表示される場合と表示されない場合があります。
ここでの他の答えは良いものです。特にデイブ・コスタのもの。一つだけ付け加えておきたいことがあります。
ランダムな動作を誰に見たいですか? プログラマーまたはエンドユーザー?
静的シードを持つ 1 つの Random オブジェクトを使用すると、常に同じアクションを実行して同じ結果を得ることができます (Random は疑似ランダムであり、実際にはランダムではありません)。これは、報告されたエラーをデバッグして再現しようとするのに不思議です!