Explication math.random ()

133

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

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

Si je veux retourner un entier 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 que faire si je voulais obtenir un nombre entre trois et cinq? Sera-ce comme la déclaration suivante:

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

Je sais pour nextInt()dans java.lang.util.Random. Mais je veux apprendre comment faire cela avec Math.random().

Suisse
la source
Pour [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening
9
BTW: la plage est de 0.0 inclus à 1.0 exclusif (vous n'obtiendrez jamais réellement 1.0) Utiliser nextInt () est un bien meilleur choix, non seulement c'est plus simple mais aussi beaucoup plus rapide.
Peter Lawrey
2
L'utilisation Math.ceilest erronée, elle donne un mauvais résultat lors du Math.random()retour 0.
starblue
Et si Math.floor renvoie 0,029? Comment toujours obtenir un nombre à deux chiffres avec une seule instruction?
Naisheel Verdhan

Réponses:

165
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 bornes sont inclusives, c'est-à-dire [2,5], et mindoivent être inférieures à celles maxde l'exemple ci-dessus.

EDIT: Si quelqu'un voulait essayer d'être stupide et inverser minet 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 doubles, 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 le rendre idiot, c'est juste:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}
AusCBloke
la source
1
Que faire si vous ne l'utilisez pas (int)et que vous souhaitez qu'il renvoie un double?
switz
Si vous voulez doubler, remplacez simplement le ints par doubles (et le typage n'est pas nécessaire). J'ai supposé que vous vouliez des ints mais je vais ajouter à mon message.
AusCBloke
2
En fait, avec doubles, supprimez le + 1également car il Math.random()n'est pas tronqué. Cependant, la plage sera [min, max) puisque Math.random"Renvoie une valeur double avec un signe positif, supérieure ou égale à 0,0 et inférieure à 1,0." Il y aurait une chance très minime que le nombre soit exactement de maxtoute façon, même si c'était possible.
AusCBloke
44

Si vous souhaitez générer un nombre compris entre 0 et 100, votre code ressemblerait à ceci:

(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ù lowerboundest inclusif et upperboundexclusif).

L'inclusion ou l'exclusion de upperbounddépend de votre choix. Disons range = (upperbound - lowerbound) + 1alors upperboundest inclus, mais si range = (upperbound - lowerbound)alors upperboundest exclusive.

Exemple: si je veux un entier compris entre 3 et 5, alors si la plage est (5-3) +1, alors 5 est inclusif, mais si la plage est juste (5-3), alors 5 est exclusif.

Teezy7
la source
2
upperboundexclusif? Je pense que ce sera inclusif.
vidit le
1
@vidit it's exclusive
1
ne pensez pas que vous obtenez une vue d'ensemble de la limite supérieure peut être non plus, comme le montre l'exemple
Teezy7
19

La Randomclasse de Java située dans le java.utilpackage servira mieux votre objectif. Il a quelques nextInt()méthodes qui retournent un entier. Celui qui prend un argument int va générer un nombre entre 0 et cet int, ce dernier n'étant pas inclusif.

G_H
la source
J'ai mis à jour ma question, j'aimerais savoir comment le faire Math.random(). Merci.
switz
1

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
Ilya Gazman
la source
0

Voici une méthode qui reçoit les limites et renvoie un entier aléatoire. Il est légèrement plus avancé (complètement universel): les limites peuvent être à la fois positives et négatives , et les limites minimum / maximum peuvent venir 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.

tolérance de panne
la source