J'utilise
var min = -13; var max = 13; var random = Math.floor(Math.random() * (max - min + 1)) + min;
7 Réponses :
Obtenez un nombre aléatoire entre 1-10 et ajouter 3, pour obtenir un entre 4-13:
random = (Math.floor(Math.random() * 2) == 0) ? 0 - random : random;
Le signe peut être facilement généré simplement par aléatoire = (math.random () <0.5)? -Random: aléatoire; code> pas besoin d'appeler math.floor code>
Le risque est extrêmement petit, mais sachant que Math.Random () fournit des valeurs de 0 (y compris!) À 1 (à l'exclusion!) , la première ligne pourrait donner une valeur de 3. D'où une pratique légèrement plus propre pour aller avec math.floor et travailler à partir de là: aléatoire = math.floor (math.random () * 10) + 4; code >
var sign = Math.round(Math.random()) == 0 ? -1 : 1; var number = Math.round(Math.random() * 9) + 4; return sign * number;
Autant que je sache, il n'est pas possible de générer un nombre aléatoire et de prendre en compte un ensemble d'exclusion. Vous devez créer une fonction récursive pour faire le filtrage pour vous. Voir ci-dessous: voici un violon de travail . P > ou, courtoisie @rozwel, une version non récursive à l'aide d'une boucle tandis que: p> voici a jsperf qui compare la réponse acceptée avec ces deux options. p> p>
Vous pouvez théoriquement entrer dans une boucle infinie
@Fabriziocalderan, es-tu sérieux? -1 pour une possibilité théorique (bien que mathématiquement impossible)?
@JaMeshill, le code entrera dans une boucle avec une probabilité nulle et une durée de fonctionnement attendue linéaire, de sorte que théoriquement ce code n'est pas trop mauvais. Avez-vous indiqué votre propre message?
@Jameshill -1 Parce qu'il n'y a rien qui empêche la fonction de générer -2, 1, 2, -3 ... plusieurs fois avant de produire une valeur valide. À l'université, j'ai vu certaines personnes rejetées pour ce type de logique. En termes pratiques, vous n'aurez pas de boucle infinie, mais cela est toujours inefficace pour la raison ci-dessus
@Fabriziocalderan, je suggère de jeter un coup d'œil à ce JSperf - JSPERF.com/random-numbergeneration
/ a>. Pouvez-vous expliquer pourquoi ma solution est plus rapide que la solution élue la plus élevée à chaque fois?
@jams pas voter, mais je dois dire que cela semble être un cas médiocre de récursivité. Vous pouvez obtenir le même résultat avec une boucle tandis que sans la surcharge des appels de fonction imbriqués.
@Rozwel, encore une fois, veuillez jeter un coup d'œil à la JSPERF - je ne dis pas que c'est la solution meilleure b> solution possible, mais je pense que c'est un très mauvais rap ...
@jameshill: Je pense que vous n'obtenez pas le point. i43.tinypic.com/1y1nbs.png . En théorie, vous ne pouvez pas être sûr d'avoir une résiliation et des termes pratiques que votre fonction peut vous appeler plusieurs fois avant de terminer.
Je ne pense pas que cela soit infini même en théorie que math.random () code> n'est pas un véritable générateur de nombres aléatoires
@Fabriziocalderan, vous ne pouvez pas simplement prendre un cas de test et poster une image. Regardez les données dans son ensemble, admin que vous êtes incorrect et supprimez votre -1. i41.tinypic.com/k9tbhu.jpg
@James tout ce que je soulignais, c'était que vous pouviez faire la même chose sans la récursive aérienne. J'ai ajouté un troisième cas à votre test à l'aide d'une boucle tandis que, du moins dans mon environnement, les multiples randoms gagnent avec la version tandis que la version a légèrement sorti la solution récursive à la deuxième place. jsperf.com/random-number-generation/2
@Rozwel, ahh. Grand point - grande suggestion. J'ajouterai ça à ma réponse.
Je ne sais pas comment cela affectera les résultats, mais ces cas de test sont assez inutiles; Parfois, vous avez le code dans une fonction, parfois non, vous utilisez parfois des nombres magiques codés, parfois vous utilisez des variables. Toutes ces divergences changent de temps de recherche, etc. Comme telles que les données ne sont pas très utiles.
@DAVIN, ils ne sont pas des chiffres magiques, ils sont les chiffres demandés dans l'OP.
Juste pour les sources, j'ai également jeté ma solution de soustraction dans la bague. Je trouve les différences entre les navigateurs assez intéressantes. Je n'aurais pas attendu que les résultats varient aussi de manière si dramatique ...
Eh bien, cela a un peu explosé. J'essayais simplement de prouver que cette réponse ne valait pas un -1 code> ...
Ils sont magiques si dans un endroit où vous écrivez 10 code> et dans un autre que vous écrivez max-min + 1 code> qui implique deux recherches, une analyse supplémentaire et deux opérations alues en supposant y 't optimisations.
@Davin Votre point m'a fait curieux, alors j'ai élargi le test pour inclure des révisions qui rapprochent les choses en ligne. Au moins pour mon navigateur, déplaçant les multiples randoms dans une fonction a entraîné un impact dramatique tout en remplaçant les "nombres magiques" avec des variables, a été un changement mineur.
jsperf.com/random-number-generation/4 Il n'est pas surprenant qu'il n'y a presque aucune différence. Ce sont des micro-optimisations. Cependant, à partir de mes tests, on dirait que la récursion est donc légèrement plus lente, probablement parce qu'il y a maintenant plus de frais généraux dans chaque branche en raison des fixations variables supplémentaires. Les deux autres sont presque identiques car une seule fonction appelle à une itération supplémentaire ou deux semblent similaires.
@Rozwel, remarquez que mes tests appellent simplement les fonctions, ils ne les créent pas. J'ai essayé d'être cohérent dans tous les tests. J'ai aussi essayé d'être réel-World - les fonctions ont besoin de paramètres.
Veuillez le prendre à l'un des Chambres de discussion . Les commentaires ne sont pas destinés aux discussions prolongées.
Certes, mes tests sont imparfaits dans la mesure où je ne teste que 4,13 comme arguments et que je devrais tester le comportement dans une plage de valeurs plus large pour évaluer les différences. Pour des valeurs raisonnables, la gamme dans ce cas ne devrait pas faire une grande partie de la différence. Cependant, la boucle et les versions récursives seront nettement plus lentes pour les valeurs «déraisonnables», telles que 500 501.
Tweak mineur à ce que vous devez le faire. Produire une aléatoire dans la plage de -6 à 13, puis si la valeur est inférieure à 4, soustraire 7. Je ne l'ai pas testé, mais je soupçonne qu'il fonctionnerait mieux que de produire deux randoms et de multiplier.
var min = -6;
var max = 13;
var random = Math.floor(Math.random() * (max - min + 1)) + min;
if(random < 4){random = random - 7;}
var pickOne = [4,5,6,7,8,9,10,11,12,13],
value = pickOne[Math.floor(Math.random() * pickOne.length)];
value = (Math.random() < 0.5)? value : -value;
console.log(value)
maths.round (math.random ()) retourne 0 ou 1,
afin qu'il puisse être écrit sans valeur intermédiaire: p>
var n = Math.floor(Math.random() * 20) - 10; n = n < 0 ? n - 3 : n + 4;
Je ne pense pas que cela soit possible. Je ferais un tableau avec les valeurs que vous souhaitez et accédez au hasard au tableau
@Evilp, qui convertirait une opération de temps constante et d'espace à un temps linéaire et d'espace. C'est comme ajouter 100 à un nombre en ajoutant 1 cent fois. Cela fonctionne, mais est de dire le moins, non advisible.
@DAVIN Comment fonctionne l'opération de temps linéaire d'accès
@Esaysaja, je n'ai pas dit que c'est, bien que la création de la matrice soit linéaire. En fait, techniquement, c'est l'espace exponentiel et le temps, car l'entrée est logarithmique dans sa valeur.
@DAVIN L'opération elle-même n'implique pas la création de tableaux, le tableau est précréé,
@Esailija et quoi s'il y a des gammes différentes? Vous aurez peut-être besoin de matrices différentes pour chaque fois, comment prédisez-vous chaque ensemble possible?
@Davin a besoin d'avoir des gammes différentes chaque fois est une situation où elle serait une opération de temps linéaire Oui.
@YUSAF - Vous devriez prendre quelques minutes pour consulter les Comps James Mettez ensemble et les différentes révisions d'eux. Si rien d'autre, il est intéressant de voir comment la solution «gagnante» change en fonction des versions du navigateur. http://jsperf.com/random-numbergeneration