3783 votes

Comment générer des nombres entiers aléatoires dans une plage spécifique en Java ?

Comment puis-je générer un échantillon aléatoire int dans une fourchette spécifique ?

J'ai essayé les éléments suivants, mais ils ne fonctionnent pas :

Tentative 1 :

randomNum = minimum + (int)(Math.random() * maximum);

Bug : randomNum peut être plus grande que maximum .

Tentative 2 :

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;

Bug : randomNum peut être plus petite que minimum .

0 votes

Lorsque vous avez besoin d'un grand nombre de nombres aléatoires, je ne recommande pas la classe Random de l'API. Elle a juste une période trop petite. Essayez la classe Torsion de Mersenne au lieu de cela. Il y a une implémentation Java .

20 votes

Avant de poster une nouvelle réponse, pensez qu'il y a déjà plus de 65 réponses à cette question. Veillez à ce que votre réponse apporte des informations qui ne figurent pas parmi les réponses existantes.

0 votes

randomNum = minimum + (int)(Math.random() * (maximum - minimum);

50voto

Joel Sjöstrand Points 159

Pardonnez-moi d'être pointilleux, mais la solution suggérée par la majorité, c'est-à-dire.., min + rng.nextInt(max - min + 1)) semble périlleux en raison du fait que.. :

  • rng.nextInt(n) ne peut pas atteindre Integer.MAX_VALUE .
  • (max - min) peut provoquer un débordement lorsque min est négatif.

Une solution infaillible renverrait des résultats corrects pour toute min <= max dans [ Integer.MIN_VALUE , Integer.MAX_VALUE ]. Considérons l'implémentation naïve suivante :

int nextIntInRange(int min, int max, Random rng) {
   if (min > max) {
      throw new IllegalArgumentException("Cannot draw random int from invalid range [" + min + ", " + max + "].");
   }
   int diff = max - min;
   if (diff >= 0 && diff != Integer.MAX_VALUE) {
      return (min + rng.nextInt(diff + 1));
   }
   int i;
   do {
      i = rng.nextInt();
   } while (i < min || i > max);
   return i;
}

Bien qu'inefficace, il faut noter que la probabilité de succès dans la while La boucle sera toujours de 50% ou plus.

34voto

Chinnery Points 5830

Je me demande si l'une des méthodes de génération de nombres aléatoires fournie par une Apache Commons Math la bibliothèque ferait l'affaire.

Par exemple : RandomDataGenerator.nextInt ou RandomDataGenerator.nextLong

34voto

Simon Points 614

J'utilise ceci :

 /**
   * @param min - The minimum.
   * @param max - The maximum.
   * @return A random double between these numbers (inclusive the minimum and maximum).
   */
 public static double getRandom(double min, double max) {
   return (Math.random() * (max + 1 - min)) + min;
 }

Vous pouvez le transformer en un nombre entier si vous le souhaitez.

31voto

Sunil Points 21

Prenons un exemple.

Supposons que je souhaite générer un nombre entre 5-10 :

int max = 10;
int min = 5;
int diff = max - min;
Random rn = new Random();
int i = rn.nextInt(diff + 1);
i += min;
System.out.print("The Random Number is " + i);

Comprenons ceci ...

Initialiser max avec la valeur la plus élevée et min avec la valeur la plus basse.

Maintenant, nous devons déterminer combien de valeurs possibles peuvent être obtenues. Pour cet exemple, ce serait :

5, 6, 7, 8, 9, 10

Ainsi, le comptage de ce dernier serait max - min + 1.

c'est-à-dire 10 - 5 + 1 = 6

Le nombre aléatoire générera un nombre entre 0-5 .

c'est-à-dire 0, 1, 2, 3, 4, 5

Ajout de la min au nombre aléatoire produirait :

5, 6, 7, 8, 9, 10

Nous obtenons ainsi la gamme souhaitée.

30voto

Michael Myers Points 82361
 rand.nextInt((max+1) - min) + min;

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