Question

Après avoir lu cette réponse: meilleur moyen de sélectionner un sous-ensemble aléatoire dans une collection ?

Cela m’a posé la question: comment choisir une graine aléatoire dans Java?

Et ne dites pas utiliser System.currentTimeMillis () ou System.nanoTime (). Lisez l'article pour savoir pourquoi.

C'est une question difficile, mais laissez-moi le rendre plus difficile. Supposons que vous deviez générer une graine aléatoire sans vous connecter à Internet, sans utiliser la saisie de l'utilisateur (IE, il n'y a pas d'interface graphique), et il faut qu'elle soit multi-plateforme (donc pas de JNI pour accéder au matériel).

Existe-t-il des variables de machine virtuelle Java que nous pouvons surveiller en tant que source de notre caractère aléatoire?

Cela peut-il être fait? Ou est-ce impossible?

Était-ce utile?

La solution

Consultez Uncommons Maths (divulgation complète: je l'ai écrit). Cela devrait résoudre la plupart des problèmes que vous rencontrez avec les nombres aléatoires en Java.

Même si vous ne l'utilisez pas, vous devriez pouvoir obtenir quelques idées des différents SeedGenerator est fourni. Fondamentalement, il utilise par défaut / dev / random . Si cela n’existe pas (Windows, par exemple), il tente de télécharger les données à partir de random.org ou il utilise SecureRandom.generateSeed .

Je pense que SecureRandom.generateSeed est ce que vous pouvez faire de mieux sans vous fier à aucune plate-forme ni à Internet.

Autres conseils

Combinez System.currentTimeMillis () avec un compteur global que vous incrémentez à chaque fois que vous générez le germe. Utilisez AtomicLong . pour le compteur afin que vous puissiez augmenter avec efficacité et la sécurité du fil.

" Combiner " ne veut pas dire " ajouter " ou " xor " parce qu'il est trop facile d'obtenir des doublons. Au lieu de cela, le hachage. Vous pourriez devenir compliqué et fourrer le long et le compteur dans par exemple 16 octets et MD5, mais j'utiliserais probablement une version 64 bits du CRC Adler ou un autre CRC 64 bits .

Euh, cet article dit que les graines 32 bits sont mauvaises, mais que les graines 64 bits sont bonnes. System.currentTimeMillis () est une valeur de départ 64 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top