• ベストアンサー

java.util.Randomのコンストラクタ

java.util.Random r = new Random(); とするとseedを設定せずにインスタンスを作れますが、この時自動的に設定されるseedは どのような値となるのでしょうか。 直接ソースを読んでみましたがAtomicLong辺りで挙動が不明となりました。 ご回答の程宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.1

ん? デフォルトコンストラクタの挙動ですよね? これは、AtomicLongは関係ないのでは? this (++seedUniquifier + System.nanoTime()); ソースを見たところ、単純にこれだけのようですよ。 もともと、確かJDK 1.4あたりまでは、new Random()は、「引数に現在の時刻(タイムスタンプ)を渡して生成する」という形でした。が、これだと全く同じタイムスタンプの瞬間に複数スレッドで同時にnewされると同じジェネレータになってしまいます。そこでシードをユニークにするようにしてあるわけです。seedUniquifierは、private static volatileが指定されており、スレッドセーフなシングルトンとなっているため、たとえ同時にアクセスされても値は常に異なるものとなります。 あるいは、Randomの乱数ジェネレータの仕組みを知りたいということだったのでしょうか。だとしたら大外れで済みません。

himura99
質問者

お礼

すいません、AtomicLongの件はちょっと勘違いして引数有りのコンストラクタを見てしまってました。 引数なしのコンストラクタはそのようになっているのですね。seedUniquifierのご説明が分かりやすく 為になりました。 ご回答ありがとうございました^^

関連するQ&A