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.
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);