134 votes

Math.random() explanation

Il s'agit d'une question assez simple concernant Java (mais probablement applicable à toute la programmation) :

Math.random() renvoie un nombre compris entre zéro et un.

Si je veux retourner un nombre entier entre zéro et cent, je le ferai :

(int) Math.floor(Math.random() * 101)

Entre un et cent, je ferais l'affaire :

(int) Math.ceil(Math.random() * 100)

Mais qu'en est-il si je veux obtenir un nombre entre trois et cinq ? Cela se passera-t-il comme dans l'énoncé suivant ?

(int) Math.random() * 5 + 3

Je connais nextInt() en java.lang.util.Random . Mais je veux apprendre à le faire avec Math.random() .

164voto

AusCBloke Points 10179
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

Sortie de randomWithRange(2, 5) 10 fois :

5
2
3
3
2
4
4
4
5
4

Les limites sont inclusives, c'est-à-dire [2,5], et min doit être inférieur à max dans l'exemple ci-dessus.

EDITAR: Si quelqu'un devait essayer d'être stupide et d'inverser min y max vous pourriez changer le code en :

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

EDIT2 : Pour votre question sur double c'est juste :

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

Et encore une fois, si vous voulez être à l'abri des erreurs, c'est tout simple :

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}

45voto

Teezy7 Points 21

Si vous souhaitez générer un nombre de 0 à 100, votre code se présentera comme suit :

(int)(Math.random() * 101);

Pour générer un nombre de 10 à 20 :

(int)(Math.random() * 11 + 10);

Dans le cas général :

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(où lowerbound est inclusif et upperbound exclusive).

L'inclusion ou l'exclusion de upperbound dépend de votre choix. Par exemple range = (upperbound - lowerbound) + 1 puis upperbound est inclusif, mais si range = (upperbound - lowerbound) puis upperbound est exclusif.

Exemple : Si je veux un nombre entier entre 3 et 5, alors si l'intervalle est (5-3)+1, 5 est inclusif, mais si l'intervalle est juste (5-3), 5 est exclusif.

19voto

G_H Points 5979

En Random de Java située dans la classe java.util servira mieux votre objectif. Il contient quelques nextInt() qui renvoient un nombre entier. Celle qui prend un argument int générera un nombre compris entre 0 et cet int, ce dernier n'étant pas inclusif.

1voto

Ilya_Gazman Points 3685

Pour générer un nombre compris entre 10 et 20 inclus, vous pouvez utiliser java.util.Random

int myNumber = new Random().nextInt(11) + 10

0voto

fault-tolerant Points 189

Voici une méthode qui reçoit des limites et renvoie un nombre entier aléatoire. Elle est légèrement plus avancée (complètement universelle) : les limites peuvent être à la fois positives et négatives et les limites minimales/maximales peuvent être placées dans n'importe quel ordre.

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

En général, il trouve la distance absolue entre les bordures, obtient une valeur aléatoire pertinente, puis décale la réponse en fonction de la bordure inférieure.

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