Existe-t-il un moyen de générer un nombre aléatoire dans une plage spécifiée (par exemple de 1 à 6: 1, 2, 3, 4, 5 ou 6) en JavaScript?
javascript
random
Mirgorod
la source
la source
Math.floor((Math.random()*10)+1);
ci ne peut pas fonctionner pour vous comme spécifié ici sur w3schools.com/jsref/jsref_random.asp ..?Réponses:
Important
Le code suivant ne fonctionne que si la valeur minimale est
1
. Il ne fonctionne pas pour des valeurs minimales autres que1
.Si vous vouliez obtenir un entier aléatoire entre 1 ( et seulement 1 ) et 6, vous calculeriez:
Où:
la source
Math.floor(Math.random() * 6) + 2
signifie que si lesMath.random()
résultats en 0.99 notre valeur aléatoire serait7
Ce qu'il fait "extra", c'est qu'il permet des intervalles aléatoires qui ne commencent pas par 1. Vous pouvez donc obtenir un nombre aléatoire de 10 à 15 par exemple. Souplesse.
la source
to
argument, l'from
arg double le maximumReturns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.
( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )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
[1,2]
, il y a 25% de chanceMath.random()
vous donnerait un certain nombre d'un de ces[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Arrondir ces intervalles donnerait 0, 1, 1, 2, ce qui n'est pas une distribution uniforme. Plancher les résultats en 0, 0, 1, 1.Math.round
overMath.floor
donnerait des résultats différents.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Autres solutions:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Essayez en ligne
la source
~~a
et OR au niveau du bit (a | 0) sont des moyens plus rapides d'écrire Math.floor (a)a | 0
est également le moyen le plus rapide et le plus optimisé pour convertir une chaîne en entier. Il ne fonctionne qu'avec des chaînes contenant des entiers ("444"
et"-444"
), c'est-à-dire sans flottants / fractions. Il donne un0
pour tout ce qui échoue. C'est l'une des principales optimisations derrière asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
etMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Pour obtenir le nombre aléatoire
generateRandomInteger(-20, 20);
EXPLICATION CI-DESSOUS
Nous devons obtenir un entier aléatoire, disons X entre min et max.
Droite?
c'est-à-dire min <= X <= max
Si nous soustrayons min de l'équation, cela équivaut à
0 <= (X - min) <= (max - min)
Maintenant, multiplions cela par un nombre aléatoire r qui est
0 <= (X - min) * r <= (max - min) * r
Maintenant, ajoutons de nouveau min à l'équation
min <= min + (X - min) * r <= min + (max - min) * r
Maintenant, permet de choisir une fonction qui résulte en r telle qu'elle satisfait notre plage d'équations comme [min, max]. Ceci n'est possible que si 0 <= r <= 1
D'ACCORD. Maintenant, la plage de r ie [0,1] est très similaire au résultat de la fonction Math.random (). N'est-ce pas?
Par exemple,
Cas r = 0
min
+ 0 * (max
-min
) = minCas r = 1
min
+ 1 * (max
-min
) = maxCas aléatoire utilisant Math.random 0 <= r <1
min
+ r * (max
-min
) = X , où X a une plage de min <= X < maxLe résultat ci-dessus X est un numérique aléatoire. Cependant, en raison de Math.random (), notre limite gauche est inclusive et la limite droite est exclusive. Pour inclure notre limite droite, nous augmentons la limite droite de 1 et fixons le résultat.
Pour obtenir le nombre aléatoire
generateRandomInteger(-20, 20)
;la source
Ou, dans Underscore
la source
la source
jsfiddle: https://jsfiddle.net/cyGwf/477/
Entier aléatoire : pour obtenir un entier aléatoire entre
min
etmax
, utilisez le code suivantNuméro à virgule flottante aléatoire: pour obtenir un nombre à virgule flottante aléatoire entre
min
etmax
, utilisez le code suivantRéférence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
la source
Les mathématiques ne sont pas mon point fort, mais j'ai travaillé sur un projet où je devais générer beaucoup de nombres aléatoires entre les deux positifs et négatifs.
Par exemple
Bien sûr, vous pouvez également ajouter une validation pour vous assurer de ne pas le faire avec autre chose que des chiffres. Assurez-vous également que min est toujours inférieur ou égal à max.
la source
min + Math.random() * max
vous donnera des nombres entre min et min + max, ce qui n'est pas ce que vous voulez. La première branche de laif
est correcte, mais pourrait être simplifiée pour direreturn min + Math.random() * (max - min)
, quelle est la bonne solution, que min soit positif ou négatif (voir les autres réponses). Gardez également à l'esprit que vous devez toujours déterminer le résultat si vous ne voulez pas de fractions.J'ai écrit une fonction plus flexible qui peut vous donner un nombre aléatoire mais pas seulement un entier.
Version fixe.
la source
Exemple
Renvoyez un nombre aléatoire entre 1 et 10:
Le résultat pourrait être:
3
Essayez-vous: ici
-
ou en utilisant lodash / undescore:
_.random(min, max)
Documents: - lodash - undescore
la source
Malgré de nombreuses réponses et presque le même résultat. Je voudrais ajouter ma réponse et expliquer son fonctionnement. Parce qu'il est important de comprendre son fonctionnement plutôt que de copier-coller un code de ligne. Générer des nombres aléatoires n'est rien d'autre que de simples calculs.
CODE:
la source
Je cherchais un générateur de nombres aléatoires écrit en TypeScript et je l'ai écrit après avoir lu toutes les réponses, j'espère que cela fonctionnera pour les codeurs TypeScript.
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 mappé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
Ajout
float
avec une version de précision fixe basée sur laint
version dans la réponse de @ Francisc:donc:
et pour réponse int
la source
Nombre entier aléatoire crypto-fort dans la plage [a, b] (hypothèse: a <b)
la source
Cela devrait fonctionner:
la source
J'ai découvert une excellente nouvelle façon de le faire en utilisant les paramètres par défaut d'ES6. Il est très astucieux car il autorise soit un argument, soit deux arguments. C'est ici:
la source
C'est environ neuf ans de retard, mais randojs.com en fait un simple doublure:
Vous avez juste besoin d'ajouter cela en tête de votre document html, et vous pouvez faire à peu près tout ce que vous voulez avec aléatoire. Valeurs aléatoires des tableaux, éléments jquery aléatoires, propriétés aléatoires des objets, et même empêchant les répétitions si nécessaire.
la source
Cela fonctionne pour moi et produit des valeurs comme la fonction de bibliothèque standard random.randint de Python :
la source
Essayez d'utiliser:
la source
renvoyer 1-6 comme un dé en gros,
la source