Pourquoi ont été 181783497276652981
et 8682522807148012
choisis Random.java
?
Voici le code source pertinent de 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);
Ainsi, l'invocation new Random()
sans aucun paramètre de départ prend le "seed uniquifier" actuel et le XOR avec System.nanoTime()
. Ensuite, il utilise 181783497276652981
pour créer un autre uniquificateur de départ à stocker pour la prochaine fois qu'il new Random()
est appelé.
Les littéraux 181783497276652981L
et 8682522807148012L
ne sont pas placés dans des constantes, mais ils n'apparaissent nulle part ailleurs.
Au début, le commentaire me donne une piste facile. La recherche en ligne de cet article produit l'article réel . 8682522807148012
n'apparaît pas dans le papier, mais 181783497276652981
apparaît - comme sous-chaîne d'un autre nombre 1181783497276652981
, qui est précédé d' 181783497276652981
un 1
.
Le papier prétend que 1181783497276652981
c'est un nombre qui donne un bon «mérite» pour un générateur congruentiel linéaire. Ce numéro a-t-il été simplement mal copié dans Java? At 181783497276652981
-il un mérite acceptable?
Et pourquoi a-t-il été 8682522807148012
choisi?
La recherche en ligne de l'un ou l'autre des nombres ne donne aucune explication, seulement cette page qui remarque également la chute 1
devant 181783497276652981
.
Aurait-on pu choisir d'autres nombres qui auraient fonctionné aussi bien que ces deux nombres? Pourquoi ou pourquoi pas?
8682522807148012
est un héritage de la version précédente de la classe, comme on peut le voir dans les révisions effectuées en 2010 . Cela 181783497276652981L
semble être une faute de frappe et vous pouvez déposer un rapport de bogue.
seedUniquifier
peut devenir extrêmement contesté sur une boîte de 64 noyaux. Un thread local aurait été plus évolutif.