Nombres aléatoires avec les mathématiques.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 a raison? Pour autant que je sache, je n'ai jamais obtenu un nombre qui était hors de ma portée avec ma formule

Author: Alex, 2011-10-28

11 answers

Votre formule génère des nombres entre min et min + max.

Celui que Google a trouvé génère des nombres entre min et max.

Google gagne!

 14
Author: pjz, 2011-10-27 22:04:54

Une meilleure approche est:

int x = rand.nextInt(max - min + 1) + min;

Votre formule génère des nombres 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

 8
Author: Mark Byers, 2011-10-27 22:08:03

Le vôtre: Le plus bas possible est min, le plus élevé possible est max+min-1

Google: Le plus bas possible est min, le plus élevé possible est max-1

 5
Author: F.J, 2011-10-27 22:04:53

Le premier génère des nombres dans la mauvaise plage, tandis que le second est correct.

Pour montrer que le premier est incorrect, disons min vaut 10 et max vaut 20. En d'autres termes, le résultat devrait être 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
Author: NPE, 2011-10-27 22:04:42

Si min=10 et max=100:

(int)(Math.random() * max) + min        

Donne un résultat compris entre 10 et 110, tandis 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é, donc 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 modifiez la variable 'max' d'être appelé "gamme")

 2
Author: Gordon Gustafson, 2011-10-27 22:08:25
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 le nombre maximum (20) - a (10) + 1 (11)

Profitez-en!

 2
Author: Jason Chi, 2013-02-04 03:59:10

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
Author: manmathan, 2011-10-27 22:09:13

Mathématiques.random ()

Renvoie une valeur double 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. Quand 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.

Donc la formule est:

(int)(Math.random()*range) + min

Et vous pouvez toujours calculer la gamme avec max-min, c'est pourquoi Google vous donne cette formule.

 1
Author: Sebastian Oberste-Vorth, 2011-10-27 22:19:52

Si min = 5, et max = 10 et Math.random() retourne (presque) 1.0, le nombre généré sera (presque) 15, ce qui est nettement plus que les choisi max.

Par rapport, 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 mathématiques sujettes aux erreurs qui sont tangentielles à votre domaine problématique.

 1
Author: millimoose, 2011-10-27 22:21:47

Math.random() génère un nombre entre 0 (inclus) et 1 (exclus).

Donc (int)(Math.random() * max) va de 0 à max-1 inclus.

, Puis (int)(Math.random() * max) + min plages de min à max + min - 1, ce qui n'est pas ce que vous voulez.

La formule de Google est correcte.

 0
Author: Andrew Cooper, 2011-10-27 22:14:13

Il y a un petit problème avec la formule que vous avez trouvée dans Google.It devrait être (int)(Math.random() * (max - min + 1) + min) pas (int)(Math.random() * (max - min) + min).

 0
Author: , 2016-05-06 02:41:58