Comment puis-je générer des nombres entiers aléatoires entre deux variables spécifiées dans JavaScript, par exemple, x = 4
et en y = 8
afficherais-je une 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
la source
la source
Réponses:
Il y a quelques exemples sur la page Mozilla Developer Network :
Voici la logique derrière cela. C'est une simple règle de trois:
Math.random()
renvoie unNumber
entre 0 (inclus) et 1 (exclusif). Nous avons donc un intervalle comme celui-ci:Maintenant, nous aimerions un nombre entre
min
(inclus) etmax
(exclusif):Nous pouvons utiliser le
Math.random
pour obtenir le correspondant dans l'intervalle [min, max). Mais, nous devons d'abord factoriser un peu le problème en soustrayantmin
du deuxième intervalle:Cela donne:
Nous pouvons maintenant postuler
Math.random
puis calculer le correspondant. Choisissons un nombre aléatoire:Donc, pour trouver
x
, nous ferions:N'oubliez pas de rajouter
min
, pour que nous obtenions un nombre dans l'intervalle [min, max):C'était la première fonction de MDN. Le second retourne un entier entre
min
etmax
, tous deux inclus.Maintenant, pour obtenir des entiers, vous pouvez utiliser
round
,ceil
oufloor
.Vous pouvez utiliser
Math.round(Math.random() * (max - min)) + min
, cela donne cependant une distribution non uniforme. Les deuxmin
etmax
seulement environ la moitié des chances de lancer:Avec
max
exclus de l'intervalle, il a une encore moins de chance de rouler quemin
.Avec
Math.floor(Math.random() * (max - min +1)) + min
vous, la distribution est parfaitement homogène.Vous ne pouvez pas utiliser
ceil()
et-1
dans cette équation, carmax
vous aviez désormais un peu moins de chances de lancer, mais vous pouvez également obtenir le résultat (indésirable)min-1
.la source
floor
, ce qui arrondit.round
, mais les deux,min
etmax
seulement la moitié des chances de rouler comme le font les autres chiffres. Vous pouvez également en soustraire un et le prendreceil
. Cela laisse cependant lemax
nombre avec un minimum de chances de rouler en raison de l'[0,1)
intervalle.la source
(Math.random() * (maximum - minimum + 1) ) << 0
est plus rapide.x << 0
,x | 0
,~~x
) au lieu deMath.floor()
convertisx
en un complément à deux avec beaucoup plus petite gamme queNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs 2⁵³), donc vous devez l' utiliser avec précaution!657348096152|0
vous obtenez 218099864 (1100111111111111000010011000 en binaire).Math.random ()
Renvoie un nombre aléatoire entier compris entre min ( inclus ) et max ( inclus ):
Ou tout nombre aléatoire compris entre min ( inclus ) et max ( non inclus ):
Exemples utiles (entiers):
** Et toujours agréable d'être rappelé (Mozilla):
la source
usage:
panne:
Nous retournons une fonction (empruntée à la programmation fonctionnelle) qui, lorsqu'elle est appelée, renverra un entier aléatoire entre les valeurs
bottom
ettop
, inclus. Nous disons «inclusif» parce que nous voulons inclure à la fois le bas et le haut dans la plage de numéros qui peuvent être retournés. De cette façon,getRandomizer( 1, 6 )
renverra 1, 2, 3, 4, 5 ou 6.(le bas est un nombre inférieur, le haut est un nombre supérieur)
Math.random()
renvoie un double aléatoire entre 0 et 1, et si nous le multiplions par un plus la différence entretop
etbottom
, nous obtiendrons un double quelque part entre0
et1+b-a
.Math.floor
arrondit le nombre à l'entier le plus proche. Nous avons donc maintenant tous les entiers entre0
ettop-bottom
. Le 1 semble déroutant, mais il doit être là parce que nous arrondissons toujours vers le bas, de sorte que le premier chiffre ne sera jamais atteint sans lui. La décimale aléatoire que nous générons doit être dans la plage0
de(1+top-bottom)
sorte que nous puissions arrondir vers le bas et obtenir un entier dans la plage0
detop-bottom
Le code de l'exemple précédent nous a donné un entier dans la plage
0
ettop-bottom
, donc tout ce que nous devons faire maintenant est d'ajouterbottom
à ce résultat pour obtenir un entier dans la plagebottom
ettop
inclusif. :RÉREMARQUE: Si vous passez d'abord une valeur non entière ou le plus grand nombre, vous obtiendrez un comportement indésirable, mais à moins que quelqu'un ne le demande, je ne vais pas me plonger dans l'argument qui vérifie le code car il est assez loin de l'intention de la question d'origine .
la source
Alternative si vous utilisez Underscore.js, vous pouvez utiliser
la source
_.uniqueId()
fonction que vous pouvez appeler pour les modèles côté client.x << 0
,x | 0
,~~x
) au lieu deMath.floor()
convertisx
en un complément à deux avec une gamme beaucoup plus petite queNumber.MAX_SAFE_INTEGER
(2³²⁻¹ contre 2⁵³), donc vous devez l' utiliser avec précaution!Renvoyez un nombre aléatoire entre 1 et 10:
Renvoie un nombre aléatoire entre 1 et 100:
la source
Si vous avez besoin d'une variable entre 0 et max, vous pouvez utiliser:
la source
Les autres réponses ne tiennent pas compte des paramètres parfaitement raisonnables de
0
et1
. Au lieu de cela, vous devez utiliser laround
place deceil
oufloor
:la source
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
Les 9 et 7 se situent-ils entre 5 et 6? ...... vous devriez le corriger ou expliquer ..Voici l'implémentation MS DotNet de la classe Random en javascript-
Utilisation:
la source
Utilisez cette fonction pour obtenir des nombres aléatoires entre une plage donnée
la source
Après avoir généré un nombre aléatoire à l'aide d'un programme informatique, il est toujours considéré comme un nombre aléatoire si le numéro sélectionné est une partie ou le numéro complet du numéro initial. Mais s'il a été changé, les mathématiciens ne l'acceptent pas comme un nombre aléatoire et ils peuvent l'appeler un nombre biaisé. Mais si vous développez un programme pour une tâche simple, ce ne sera pas un cas à considérer. Mais si vous développez un programme pour générer un nombre aléatoire pour une substance précieuse comme un programme de loterie ou un jeu de hasard, votre programme sera rejeté par la direction si vous n'êtes pas intéressé par le cas ci-dessus.
Donc, pour ce genre de personnes, voici ma suggestion:
Générez un nombre aléatoire en utilisant
Math.random()
. (Dites cecin
)Si vous savez lire un tableau de nombres aléatoires pour choisir un nombre aléatoire, vous savez que le processus ci-dessus (multipliant par 1, 10, 100 et ainsi de suite) ne viole pas celui que j'ai mentionné au début (car il ne change que le place du point décimal.)
Étudiez l'exemple suivant et développez-le selon vos besoins.
Si vous avez besoin d'un échantillon [0,9] alors l'étage de n * 10 est votre réponse et si besoin [0,99] alors l'étage de n * 100 est votre réponse et ainsi de suite.
Laissez maintenant entrer dans votre rôle:
Vous avez demandé des chiffres parmi une plage spécifique. (Dans ce cas, vous êtes biaisé dans cette plage. - En prenant un nombre de [1,6] en lançant un dé, alors vous êtes biaisé en [1,6] mais c'est toujours un hasard si et seulement si le dé est sans biais .)
Considérez donc votre plage ==> [78, 247] nombre d'éléments de la plage = 247 - 78 + 1 = 170; (puisque les deux limites sont inclusives.
Remarque: Dans la première méthode, j'ai d'abord créé un tableau qui contient les nombres dont vous avez besoin, puis je les ai placés au hasard dans un autre tableau. Dans la deuxième méthode, générez des nombres au hasard et vérifiez que ceux-ci sont dans la plage dont vous avez besoin. Mettez-le ensuite dans un tableau. Ici, j'ai généré deux nombres aléatoires et utilisé le total d'entre eux pour maximiser la vitesse du programme en minimisant le taux d'échec que l'obtention d'un nombre utile. Cependant, l'ajout de nombres générés donnera également un certain biais. Je recommanderais donc ma première méthode pour générer des nombres aléatoires dans une plage spécifique.
Dans les deux méthodes, votre console affichera le résultat. (Appuyez sur f12 dans Chrome pour ouvrir la console)
la source
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] les nombres 1 et 6 seront nécessairement roulés moins de fois que 2, 3, 4 et 5. Cependant, la différence est fondamentalement insignifiante.Pour un entier aléatoire avec une plage, essayez:
la source
Pour tester cette fonction et les variantes de cette fonction, enregistrez le code HTML / JavaScript ci-dessous dans un fichier et ouvrez-le avec un navigateur. Le code produira un graphique montrant la distribution d'un million d'appels de fonction. Le code enregistrera également les cas de bord, donc si la fonction produit une valeur supérieure au max ou inférieure au min, vous.serez.savoir.environ.it.
la source
Pour obtenir un nombre aléatoire, disons entre 1 et 6, faites d'abord:
Cela multiplie un nombre aléatoire par 6, puis y ajoute 0,5. Arrondissez ensuite le nombre à un entier positif en faisant:
Ceci arrondit le nombre au nombre entier le plus proche.
Ou pour le rendre plus compréhensible, procédez comme suit:
En général, le code pour ce faire en utilisant des variables est:
La raison pour laquelle vous supprimez 0,5 de la valeur minimale est que l'utilisation de la valeur minimale seule vous permettrait d'obtenir un entier supérieur de un à votre valeur maximale. En supprimant 0,5 de la valeur minimale, vous empêchez essentiellement la valeur maximale d'être arrondie.
J'espère que cela pourra aider.
la source
En utilisant le code suivant, vous pouvez générer un tableau de nombres aléatoires, sans répétition, dans une plage donnée.
la source
Je sais que cette question a déjà reçu une réponse, mais ma réponse pourrait aider quelqu'un.
J'ai trouvé cette méthode simple sur W3Schools:
J'espère que cela aiderait quelqu'un.
la source
Nombre entier aléatoire entre le plus bas et le plus haut:
Pas la solution la plus élégante .. mais quelque chose de rapide.
la source
Voici ce que j'utilise pour générer des nombres aléatoires.
Nous exécutons
high++
parce queMath.random()
génère un nombre aléatoire entre 0, (inclus) et 1 (exclusif) Celui qui est exclu, signifie que nous devons augmenter le plus haut de un avant d'exécuter tout calcul. Nous soustrayons ensuite le bas du haut, ce qui nous donne le nombre le plus élevé à générer - bas, puis + bas, ramenant le haut à la normale et faisant le plus petit nombre au moins bas. puis nous retournons le nombre résultantrandom(7,3)
pourrait revenir3,4,5,6, or 7
la source
high
n'est utilisé qu'une seule fois, vous pouvez également utiliserhigh-low+1
plutôt que d'avoir l'instruction d'incrémentation distincte. De plus, la plupart des utilisateurs s'attendent à ce que lelow
paramètre vienne en premier.Uint8Array crée un tableau rempli d'un nombre jusqu'à 3 chiffres qui serait un maximum de 999. Ce code est très court.
la source
Voici un exemple de fonction javascript qui peut générer un nombre aléatoire de n'importe quelle longueur spécifiée sans utiliser Math.random ():
la source
c'est mon point de vue sur un nombre aléatoire dans une plage, comme dans je voulais obtenir un nombre aléatoire dans une plage de base à exposant. par exemple base = 10, exposant = 2, donne un nombre aléatoire de 0 à 100, idéalement, etc.
si cela permet de l'utiliser, le voici:
la source
Math.random()
est rapide et convient à de nombreuses fins, mais ce n'est pas approprié si vous avez besoin de valeurs sécurisées sur le plan cryptographique (ce n'est pas sécurisé), ou si vous avez besoin d'entiers d'une distribution sans biais complètement uniforme (l'approche de multiplication utilisée dans d'autres réponses produit certaines valeurs un peu plus souvent que d'autres).Dans de tels cas, nous pouvons utiliser
crypto.getRandomValues()
pour générer des entiers sécurisés et rejeter toutes les valeurs générées que nous ne pouvons pas mapper uniformément dans la plage cible. Ce sera plus lent, mais il ne devrait être significatif que si vous générez un nombre extrêmement élevé de valeurs.Pour clarifier le problème de distribution biaisée, considérons le cas où nous voulons générer une valeur entre 1 et 5, mais nous avons un générateur de nombres aléatoires qui produit des valeurs entre 1 et 16 (une valeur de 4 bits). Nous voulons avoir le même nombre de valeurs générées correspondant à chaque valeur de sortie, mais 16 ne se divise pas également par 5: il reste un reste de 1. Nous devons donc rejeter 1 des valeurs générées possibles et continuer uniquement lorsque nous obtenons l'une des 15 valeurs inférieures qui peuvent être uniformément cartographiées dans notre plage cible. Notre comportement pourrait ressembler à ce pseudocode:
Le code suivant utilise une logique similaire, mais génère à la place un entier 32 bits, car il s'agit de la plus grande taille d'entier commun pouvant être représentée par le
number
type standard de JavaScript . (Cela peut être modifié pour utiliserBigInt
s si vous avez besoin d'une plus grande plage.) Quelle que soit la plage choisie, la fraction des valeurs générées qui sont rejetées sera toujours inférieure à 0,5, donc le nombre attendu de rejets sera toujours inférieur à 1,0 et généralement proche de 0,0; vous n'avez pas à vous en préoccuper en boucle pour toujours.la source
Crypto-Strong
Pour obtenir un nombre entier aléatoire crypto-fort dans ragne [x, y] essayez
la source
Vous pouvez vous cet extrait de code,
la source
do - while
place dewhile
Ionuț G. Stan a écrit une excellente réponse, mais elle était un peu trop complexe à comprendre. J'ai donc trouvé une explication encore plus simple des mêmes concepts sur https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation par Jason Anello.
REMARQUE: La seule chose importante que vous devez savoir avant de lire l'explication de Jason est une définition de "tronquer". Il utilise ce terme pour décrire
Math.floor()
. Le dictionnaire Oxford définit "tronquer" comme:la source
Cela peut gérer la génération d'un nombre aléatoire UNIQUE jusqu'à 20 chiffres
JS
JsFiddle
la source
/ * Écrire une fonction appelée
randUpTo
qui accepte un nombre et renvoie un nombre entier aléatoire entre 0 et ce nombre? * // * Écrivez une fonction appelée
randBetween
qui accepte deux nombres représentant une plage et renvoie un nombre entier aléatoire entre ces deux nombres. * // * Écrire une fonction appelée
randFromTill
qui accepte deux nombres représentant une plage et renvoie un nombre aléatoire entre min (inclus) et max (exclusif). * // * Écrire une fonction appelée
randFromTo
qui accepte deux nombres représentant une plage et renvoie un entier aléatoire entre min (inclus) et max (inclus) * /la source
J'ai fait cette fonction qui prend en compte des options comme min, max, exclude (une liste d'entiers à exclure) et seed (au cas où vous voudriez un générateur aléatoire prédéfini).
Il peut être utilisé comme:
Ou plus simplement:
Ensuite, vous pouvez faire:
Gist: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
la source
Math.floor arrondit un nombre à l'entier le plus proche
Donc, pour générer un entier aléatoire entre 4 et 8 inclus, appelez la fonction ci-dessus avec les arguments suivants:
la source
Ma méthode pour générer un nombre aléatoire entre 0 et n, où n <= 10 (n exclu):
la source