Pour générer des nombres aléatoires, j'ai utilisé la formule:
(int)(Math.random() * max) + min
La formule que je trouve sur Google semble toujours être:
(int)(Math.random() * (max - min) + min)
Lequel est le droit? Autant que je sache, je n’ai jamais obtenu un chiffre qui soit hors de portée avec ma formule
Votre formule génère des nombres compris entre min et min + max.
Celui trouvé par Google génère des nombres compris entre min et max.
Google gagne!
Une meilleure approche est:
int x = Rand.nextInt(max - min + 1) + min;
Votre formule génère des nombres compris entre min
et min + max
.
Random random = new Random(1234567);
int min = 5;
int max = 20;
while (true) {
int x = (int)(Math.random() * max) + min;
System.out.println(x);
if (x < min || x >= max) { break; }
}
Résultat:
10
16
13
21 // Oops!!
Voir en ligne ici: ideone
Le plus bas possible est min, le plus haut possible est max + min-1
Google: le plus bas possible est min, le plus haut possible est max-1
Le premier génère des nombres dans la mauvaise plage, tandis que le second est correct.
Pour montrer que le premier est incorrect, supposons que min
vaut 10 et max
égale 20. En d'autres termes, le résultat attendu est supérieur ou égal à dix et strictement inférieur à vingt. Si Math.random()
renvoie 0.75
, le résultat de la première formule est 25
, ce qui est en dehors de la plage.
si min=10
et max=100
:
(int)(Math.random() * max) + min
donne un résultat entre 10 et 110, alors que
(int)(Math.random() * (max - min) + min)
donne un résultat entre 10 et 100, donc ce sont des formules très différentes . Ce qui est important ici, c’est la clarté. Par conséquent, quoi que vous fassiez, assurez-vous que le code indique clairement ce qui est généré.
(PS. Le premier a plus de sens si vous changez la variable 'max' pour qu'elle s'appelle 'range')
int i = (int) (10 +Math.random()*11);
cela vous donnera un nombre aléatoire compris entre 10 et 20.
la clé ici est:
a + Math.random()*b
un nombre de départ (10) et un nombre de fin est un nombre maximum (20) - a (10) + 1 (11)
Prendre plaisir!
Si min = 5
, et max = 10
, et Math.random()
renvoie (presque) 1,0, le nombre généré sera (presque) 15, ce qui est clairement supérieur à la variable max
choisie.
À cet égard, c’est pourquoi chaque API de nombres aléatoires devrait vous permettre de spécifier explicitement min et max. Vous ne devriez pas avoir à écrire des maths sujettes aux erreurs qui soient tangentiels à votre domaine problématique.
Google a raison :-)
La formule de Google crée des nombres entre: min et max Votre formule crée des nombres entre: min et (min + max)
Math.random ()
Retourne une double valeur avec un signe positif, supérieur ou égal à 0,0 et moins de 1,0.
Maintenant, cela dépend de ce que vous voulez accomplir. Lorsque vous voulez avoir des nombres de 1 à 100 par exemple, il vous suffit d’ajouter
(int)(Math.random()*100)
Donc, 100 est la plage de valeurs. Lorsque vous souhaitez modifier le début de la plage de 20 à 120, vous devez ajouter +20 à la fin.
La formule est donc:
(int)(Math.random()*range) + min
Et vous pouvez toujours calculer la plage avec max-min, c’est pourquoi Google vous propose cette formule.
Math.random()
génère un nombre compris entre 0 (inclus) et 1 (exclusif).
Donc, (int)(Math.random() * max)
va de 0
à max-1
inclus.
Alors (int)(Math.random() * max) + min
va de min
à max + min - 1
, ce qui n’est pas ce que vous voulez.
La formule de Google est correcte.
Il y a un petit problème avec la formule que vous avez trouvée dans Google. Elle devrait être (int)(Math.random() * (max - min + 1) + min)
et non (int)(Math.random() * (max - min) + min)
.