なぜ、181783497276652981
そして8682522807148012
選ばれたのRandom.java
ですか?
Java SE JDK 1.7の関連するソースコードは次のとおりです。
/**
* Creates a new random number generator. This constructor sets
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
private static long seedUniquifier() {
// L'Ecuyer, "Tables of Linear Congruential Generators of
// Different Sizes and Good Lattice Structure", 1999
for (;;) {
long current = seedUniquifier.get();
long next = current * 181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
private static final AtomicLong seedUniquifier
= new AtomicLong(8682522807148012L);
したがって、new Random()
シードパラメータなしで呼び出すと、現在の「シード一意化子」が取得され、とXORされSystem.nanoTime()
ます。次に181783497276652981
、次にnew Random()
呼び出されるときに格納される別のシード一意化子を作成するために使用します。
リテラル181783497276652981L
と8682522807148012L
は定数には配置されませんが、他の場所には表示されません。
最初のコメントは私に簡単なリードを与えます。その記事をオンラインで検索すると、実際の記事が表示されます。 8682522807148012
紙には表示されませんが、181783497276652981
表示されない-別の番号の列として1181783497276652981
である、181783497276652981
と1
前に追加。
この論文で1181783497276652981
は、これは線形合同生成器に良い「メリット」をもたらす数であると主張しています。この数値は単にJavaに誤ってコピーされたのでしょうか?181783497276652981
許容できるメリットがありますか?
そして、なぜ8682522807148012
選ばれたのですか?
どちらかの番号をオンラインで検索しても説明はありません。このページだけ1
がの前にドロップされていることに気づきます181783497276652981
。
これらの2つの数値と同様に機能する他の数値を選択できましたか?なぜか、なぜそうでないのか?
8682522807148012
2010年に行われた改訂でわかるように、クラスの以前のバージョンのレガシーです。181783497276652981L
確かにタイプミスのようで、バグレポートを提出することができます。
seedUniquifier
64コアボックスでは非常に競合する可能性があります。スレッドローカルの方がスケーラブルだったでしょう。