Générer un nombre aléatoire en JavaScript
La méthode random() de l’objet Math de JavaScript permet de générer un nombre aléatoire certes… Mais compris entre 0 et 1. Nous allons voir ici comment créer une fonction nous permettant de générer un nombre aléatoire compris entre deux nombres que nous indiquerons en arguments.
La fonction aleatoire()
Commençons déjà par créer le début de notre fonction :
1 2 3 4 | function aleatoire(minimum, maximum) { return Math.round(Math.random()); } |
Nous générons ici un nombre aléatoire compris entre 0 et 1 que nous arrondissons avec la méthode round(). Nous obtiendrons donc soit 0, soit 1. Ce n’est pas encore ce que nous voulons.
Nous avons un minimum à atteindre. Par exemple si nous indiquons 100 en minimum, nous aimerions bien que si la méthode random() renvoie 0, la fonction aleatoire(), elle, nous renvoie 100. Pour cela, il suffit d’ajouter le minimum au nombre généré.
1 2 3 4 | function aleatoire(minimum, maximum) { return Math.round(minimum + Math.random()); } |
Nous obtenons donc un nombre aléatoire compris entre minimum et… minimum + 1. Ce n’est pas encore ça, même si on s’approche du résultat.
Pour atteindre le maximum, nous devons modifier le nombre aléatoire renvoyé par random(), mais pas n’importe comment évidemment. En fait, il suffit de réfléchir logiquement. En effet, si random() renvoie 1, il faut que aleatoire() renvoie la valeur de l’argument maximum. Si on oubliait le minimum, on penserait à multiplier le nombre de random() par le maximum : on obtiendrait un nombre compris entre 0 et maximum.
Cette opération qui paraît logique, nous pouvons l’utiliser pour utiliser notre minimum. Pour le moment, nous ajoutons minimum à un nombre aléatoire simple. Nous devons donc ajouter minimum à un certain nombre de sorte à atteindre le maximum si random() renvoie 1. On ne peut pas ajouter le maximum : faites l’essai avec des exemples simples, vous verrez que ça ne fonctionne pas (du tout). Si on multiplie le nombre aléatoire par le maximum, on se retrouve avec un nombre compris entre minimum et (minimum + maximum). Ça ne va pas. Mais justement, ce (minimum + maximum) ne vous donne-t-il pas une idée ? Si on multipliait par la différence qu’il y a entre le maximum et le minimum, qu’obtiendrions-nous ? La réponse est un nombre compris entre minimum et maximum.
1 2 3 4 | function aleatoire(minimum, maximum) { return Math.round(minimum + Math.random() * (maximum - minimum)); } |
Preuve
On peut prouver avec des outils mathématiques que nous obtenons bel et bien un nombre compris entre minimum et maximum.
Soit x le nombre renvoyé par random().
Soit m le minimum voulu.
Soit M le maximum voulu.
0 ≤ x ≤ 1
⇔ 0 ≤ x(M - m) ≤ M - m
⇔ m ≤ m + x(M - m) ≤ m + (M - m)
⇔ m ≤ m + x(M - m) ≤ M
C.Q.F.D.

