web-dev-qa-db-fra.com

Nombres aléatoires avec Math.random () en Java

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

13
Alex

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!

14
pjz

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

9
Mark Byers

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

5
F.J

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.

2
NPE

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')

2
Gordon Gustafson
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!

2
Jason Chi

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.

1
millimoose

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)

1
manmathan

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.

0
Andrew Cooper

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

0
user6232985