Qu'apprenons-nous des livres?
Le moyen le plus évident et le plus intuitif est de générer des nombres aléatoires en Java avec un simple appel:
java.lang.math.random ()
Dans toutes les autres langues, la génération de nombres aléatoires, c'est comme utiliser des classes d'outils mathématiques telles que l'ABS, le POW, le sol, le SQRT et d'autres fonctions mathématiques. La plupart des gens apprennent cette catégorie à travers des livres, des tutoriels et des cours. Un exemple simple: un nombre de points flottants à double précision peut être généré de 0,0 à 1,0. Ensuite, à travers les informations ci-dessus, le développeur souhaite générer un numéro de point flottant à double précision entre 0,0 et 10,0 et l'écrire comme ceci:
Math.random () * 10
Si un entier entre 0 et 10 est généré, il sera écrit comme:
Math.round (math.random () * 10)
Avancé
En lisant le code source de math.random (), ou simplement en utilisant la fonction d'achèvement automatique de l'IDE, les développeurs peuvent facilement constater que java.lang.math.random () utilise un objet généré aléatoire interne - un objet très puissant peut être aléatoire flexible Génération: valeurs booléennes, tous les types numériques et même les distributions gaussiennes. Par exemple:
new Java.util.random (). NextInt (10)
Il a un inconvénient, c'est-à-dire que c'est un objet. Sa méthode doit être appelée via une instance, ce qui signifie que son constructeur doit être appelé en premier. S'il y a une mémoire suffisante, des expressions comme celle ci-dessus sont acceptables; mais en cas de mémoire insuffisante, cela entraînera des problèmes.
Une solution simple qui peut éviter de créer une nouvelle instance chaque fois qu'un nombre aléatoire consiste à utiliser une classe statique. Vous avez peut-être pensé à java.lang.math, très bien, nous améliorons l'initialisation de java.lang.math. Bien que ce projet soit faible, vous devez également faire des tests unitaires simples pour vous assurer qu'il ne tourne pas.
En supposant que le programme doit générer un nombre aléatoire à stocker, le problème revient. Par exemple, il est parfois nécessaire de fonctionner ou de protéger les graines, et un nombre interne est utilisé pour stocker l'état et calculer le prochain numéro aléatoire. Dans ces cas particuliers, il est inapproprié de partager des objets générés de manière aléatoire.
concurrent
Dans l'environnement de l'application multithread Java EE, les objets d'instance générés au hasard peuvent toujours être stockés dans une classe ou une autre classe d'implémentation en tant que propriété statique. Heureusement, Java.util.Random est en file, il n'y a donc aucun risque que plusieurs appels de fil détruisent la graine.
Une autre chose qui mérite d'être considérée est l'instance multithread de java.lang.threadlocal. L'approche paresseuse consiste à implémenter une seule instance via l'API Java lui-même.
Bien que Java ne fournit pas un bon moyen de gérer une seule instance de java.util.random. Cependant, le Java 7 tant attendu fournit une nouvelle façon de générer des nombres aléatoires:
java.util.concurrent.threadlocalrandom.current (). NextInt (10)
Cette nouvelle API combine les avantages de deux autres approches: un accès à instance unique / statique, aussi flexible que math.random (). Le threadlocalrandom est également plus rapide que toute autre façon de gérer une concurrence élevée.
expérience
Chris Marasti-Georg souligne:
Math.round (math.random () * 10)
Rendre la distribution déséquilibrée, par exemple: 0,0 - 0,499999 sera tourné à 0, tandis que 0,5 à 1,4999999 sera tourné à 1. Alors, comment utiliser la syntaxe à l'ancienne pour obtenir une distribution équilibrée correcte, comme suit:
Math.floor (math.random () * 11)
Heureusement, si nous utilisons java.util.random ou java.util.concurrent.threadlocalrandom, nous n'avons pas à nous soucier de ce qui précède.
Le projet Java Practical présente certains des dommages de l'incorrection à l'aide de l'API Java.util.Random. Cette leçon nous dit de ne pas utiliser:
Math.abs (rnd.nextint ())% n
Et utilisation:
rnd.nextint (n)
Ythe ci-dessus est une introduction connexe à n nombres aléatoires en Java, et j'espère que cela sera utile à l'apprentissage de tout le monde.