Java Language Nombres aléatoires dans une plage spécifique


Exemple

La méthode nextInt(int bound) de Random accepte une limite exclusive supérieure, c'est-à-dire un nombre que la valeur aléatoire renvoyée doit être inférieure à. Cependant, seule la méthode nextInt accepte une borne; nextLong , nextDouble etc. ne le font pas.

Random random = new Random();
random.nextInt(1000); // 0 - 999

int number = 10 + random.nextInt(100); // number is in the range of 10 to 109

À partir de Java 1.7, vous pouvez également utiliser ThreadLocalRandom ( source ). Cette classe fournit un générateur de nombres pseudo-aléatoires (PRNG). Notez que la méthode nextInt de cette classe accepte les limites supérieure et inférieure.

import java.util.concurrent.ThreadLocalRandom;

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
ThreadLocalRandom.current().nextInt(min, max + 1);

Notez que la documentation officielle indique que nextInt(int bound) peut faire des choses étranges lorsque la bound est proche de 2 30 +1 (emphase ajoutée):

L'algorithme est un peu délicat. Il rejette les valeurs qui entraîneraient une distribution inégale (due au fait que 2 ^ 31 n'est pas divisible par n). La probabilité qu'une valeur soit rejetée dépend de n. Le pire des cas est n = 2 ^ 30 + 1, pour lequel la probabilité d'un rejet est 1/2, et le nombre attendu d'itérations avant que la boucle ne se termine est 2.

En d'autres termes, spécifier une limite diminuera (légèrement) les performances de la méthode nextInt , et cette diminution de la performance deviendra plus prononcée à mesure que la bound approche la moitié de la valeur max int.