web-dev-qa-db-fra.com

Explication Math.random ()

Ceci est une question Java assez simple (bien que probablement applicable à toute la programmation):

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

Si je veux retourner un entier compris entre zéro et cent, je ferais:

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

Entre un et cent, je ferais:

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

Mais si je voulais obtenir un nombre entre trois et cinq? Sera-ce comme la déclaration suivante: 

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

Je connais nextInt() dans Java.lang.util.Random. Mais je veux apprendre à faire cela avec Math.random().

116
switz
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.

EDIT: Si quelqu'un voulait essayer d'être stupide et inverser min et max, vous pouvez 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 doubles, c'est simplement:

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

Et encore une fois si vous voulez vous protéger des idiots, c'est juste:

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

Si vous voulez générer un nombre compris entre 0 et 100, votre code devrait ressembler à ceci:

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

Pour générer un nombre compris entre 10 et 20:

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

Dans le cas général:

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

(où lowerbound et upperbound sont inclus).

L’inclusion ou l’exclusion de upperbound dépend de votre choix . Disons que range = (upperbound - lowerbound) + 1 alors upperbound est inclusif, mais si range = (upperbound - lowerbound) alors upperbound est exclusif.

Exemple: Si je veux un entier compris entre 3 et 5, alors si étendue est (5-3)+1, alors 5 est inclusive, mais si étendue est simplement (5-3), alors 5 est exclusif. 

41
Teezy7

La classe Random de Java située dans le package Java.util vous sera plus utile. Il a des méthodes nextInt() qui renvoient un entier. Celui qui prend un argument int générera un nombre compris entre 0 et int, le dernier n'étant pas inclus.

18
G_H

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
1
Ilya Gazman

Voici une méthode qui reçoit des limites et retourne un entier aléatoire. Il est légèrement plus avancé (complètement universel): les limites peuvent être positives et négatives , et les limites minimum/maximum peuvent entrer 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 frontières, obtient une valeur aléatoire pertinente, puis décale la réponse en fonction de la bordure inférieure.

0
fault-tolerant