Math.random() a expliqué


97

Ceci est un assez simple Java (mais probablement applicable à toute la programmation) Question:

Math.random() renvoie un nombre de zéro à un.

Si je veux retourner un entier de zéro à cent, je le ferais:

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

D'un à cent, je le ferais:

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

Mais si je voulais pour le faire de trois à cinq? Sera-ce comme la déclaration suivante:

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

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

+8

BTW: la plage est comprise entre 0.0 et 1.0 (vous n'obtiendrez jamais 1.0) L'utilisation de nextInt() est un meilleur choix, non seulement plus simple mais aussi plus rapide. 01 nov.. 112011-11-01 08:23:20

+1

L'utilisation de 'Math.ceil' est fausse, elle donne un mauvais résultat quand' Math.random() 'retourne' 0'. 02 nov.. 112011-11-02 07:26:05

  0

Pour [3,5]: '(int) Math.floor (Math.random() * 3) + 3' 01 nov.. 112011-11-01 02:19:45

  0

Que faire si Math.floor renvoie 0.029? Comment obtenir toujours un numéro à deux chiffres avec une seule déclaration? 03 oct.. 152015-10-03 14:33:20

130
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 inclus, à savoir [2,5], et min doit être inférieure à max dans l'exemple ci-dessus.

EDIT: Si quelqu'un allait essayer d'être stupide et inverser min et max, vous pouvez changer le code:

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 s, il est juste :

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

Et encore une fois si vous voulez zappe ce qu'il est juste:

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

Que faire si vous n'utilisez pas '(int)' et que vous voulez retourner un 'double'? 01 nov.. 112011-11-01 02:36:27

  0

Si vous voulez double, il suffit de remplacer le 'int's par' double's (et le typecast est inutile). J'ai supposé que vous vouliez 'Int' mais je vais ajouter à mon poste. 01 nov.. 112011-11-01 02:40:36

+1

En fait, avec 'double's, supprimez le' + 1' puisque 'Math.random()' n'est pas tronqué. Cependant, la plage sera [min, max) depuis 'Math.random'" Renvoie une valeur double avec un signe positif, supérieur ou égal à 0.0 et inférieur à 1.0. " Il y aurait une chance très minime que le nombre soit exactement 'max' de toute façon même si c'était possible. 01 nov.. 112011-11-01 02:47:13

  0

Bonne réponse, merci! 01 nov.. 112011-11-01 19:06:00


17

La classe Random de Java située dans le package java.util répondra mieux à vos besoins. Il a quelques méthodes nextInt() qui retournent un nombre entier. Celui qui prend un argument int va générer un nombre compris entre 0 et cet entier, ce dernier n'étant pas inclusif.

  0

J'ai mis à jour ma question, j'aimerais savoir comment le faire avec 'Math.random()'. Merci. 01 nov.. 112011-11-01 02:17:56

  0

+1 pour la façon la plus fiable de le faire. 01 nov.. 112011-11-01 02:29:57


36

Si vous souhaitez générer un nombre de 0 à 100 puis votre code ressemblerait à ceci:

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

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

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

En général cas:

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

(où lowerbound est inclusive et upperbound exclu sive).

L'inclusion ou l'exclusion de Uppderbound dépend de votre choix. Disons que Range = (Uppderbound-lowerbound) +1 alors le Uppderbound est Inclusive.mais si la plage = (Uppderbound-lowerbound) alors la Uppderbound est Exclusive. Ex: Si je veux un entier N/B 3-5, alors si la plage est (5-3) +1 alors 5 est inclus, si la plage est juste (5-3) alors 5 est Exclusif.

+2

«upperbound» exclusif? Je pense que ce sera inclusif. 07 sept.. 162016-09-07 14:55:13

  0

@vidit c'est exclusif 20 janv.. 172017-01-20 22:49:21