Pourquoi ont été 181783497276652981et 8682522807148012choisis 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 181783497276652981pour créer un autre uniquificateur de départ à stocker pour la prochaine fois qu'il new Random()est appelé.
Les littéraux 181783497276652981Let 8682522807148012Lne 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 . 8682522807148012n'apparaît pas dans le papier, mais 181783497276652981apparaît - comme sous-chaîne d'un autre nombre 1181783497276652981, qui est précédé d' 181783497276652981un 1.
Le papier prétend que 1181783497276652981c'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é 8682522807148012choisi?
La recherche en ligne de l'un ou l'autre des nombres ne donne aucune explication, seulement cette page qui remarque également la chute 1devant 181783497276652981.
Aurait-on pu choisir d'autres nombres qui auraient fonctionné aussi bien que ces deux nombres? Pourquoi ou pourquoi pas?
8682522807148012est 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 181783497276652981Lsemble être une faute de frappe et vous pouvez déposer un rapport de bogue.
seedUniquifierpeut devenir extrêmement contesté sur une boîte de 64 noyaux. Un thread local aurait été plus évolutif.

