2 votes

Pourquoi les fonctions nextDouble(), nextFloat() et nextLong() n'acceptent-elles pas de borne dans java.util.Random ?

Je lisais java.util.Random et a remarqué qu'il n'y a pas de nextDouble() , nextFloat() y nextLong() qui peut accepter un lié .

Il y a plusieurs façons de procéder comme ceci .

Mais ma question est de savoir pourquoi java ne nous a pas fourni ces méthodes requises comme nextInt(int n) qui acceptent la liaison.

Y a-t-il une raison particulière pour laquelle ils n'ont pas fourni ces méthodes ?

4voto

GhostCat Points 83269

Une bonne API s'efforce toujours de fournir la essentiel les éléments dont l'utilisateur a besoin pour faire son travail.

Avoir nextInt(int n) n'est qu'un possible la mise en œuvre. Que faire si vous avez besoin autres distributions ?!

En d'autres termes, l'API aléatoire pourrait essayer d'anticiper les éléments suivants tous des modèles d'utilisation potentiels, mais cela serait très gonflement l'ensemble de l'API. Au lieu de cela, les concepteurs ont choisi une interface très réduite - mais vous disposez de tous les éléments nécessaires pour construire vos propres choses par-dessus.

Le fait est qu'en fin de compte, il s'agit d'une style de conception décision des personnes qui ont créé la classe Random. Et comme souvent, les problèmes peuvent être résolus de différentes manières. Il ne faut donc pas tirer de conclusions profondes sur la solution choisie ici.

0voto

vikingsteve Points 6357

En examinant le code de Random.java (dans le jdk 8), il y a deux déclarations qui ressortent.

 * The algorithm is slightly tricky.  It rejects values that would result
 * in an uneven distribution (due to the fact that 2^31 is not divisible
 * by n). The probability of a value being rejected depends on n.

y

 * Linear congruential pseudo-random number generators such as the one
 * implemented by this class are known to have short periods in the
 * sequence of values of their low-order bits.

Sans être un expert en génération de nombres aléatoires (on parle de pseudo génération de nombres aléatoires), il semble évident que l'algorithme essaie de mieux retourner des nombres "aléatoires" que si l'on fait simplement next() % bound en termes d'aléa (et éventuellement d'efficacité).

Il y a aussi le facteur de commodité, mais cela ne semble pas être la raison principale, étant donné les commentaires dans le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X