Comment générer des nombres aléatoires uniques entre 1 et 100 en utilisant JavaScript?
javascript
random
integer
numbers
dingue
la source
la source
Réponses:
Par exemple: pour générer 8 nombres aléatoires uniques et les stocker dans un tableau, vous pouvez simplement faire ceci:
la source
Returns a random number between 0 (inclusive) and 1 (exclusive)
. Sithe Math.random()
accidentellement renvoie 0, leMath.ceil(0)
vaut également 0, bien que la chance soit faible.la source
randlines file | head -10
.Générez une permutation de 100 nombres, puis choisissez en série.
Utilisez l' algorithme Knuth Shuffle (alias le mélange Fisher-Yates) .
JavaScript:
CODE COPIÉ À PARTIR DU LIEN.
MODIFIER :
Code amélioré:
Problème potentiel:
Supposons que nous ayons un tableau de 100 nombres {par exemple [1,2,3 ... 100]} et que nous arrêtions d'échanger après 8 swaps; alors la plupart du temps, le tableau ressemblera à {1,2,3,76,5,6,7,8, ... les nombres ici seront mélangés ... 10}.
Parce que chaque nombre sera échangé avec une probabilité de 1/100 donc prob. d'échanger les 8 premiers nombres est 8/100 alors que prob. de l'échange des 92 autres est de 92/100.
Mais si nous exécutons un algorithme pour un tableau complet, nous sommes sûrs (presque) que chaque entrée est permutée.
Sinon, nous sommes confrontés à une question: quels 8 numéros choisir?
la source
Solution JS moderne utilisant Set (et cas moyen O (n))
la source
Math.floor(Math.random()*100) + 1
Set
dans JS! Cependant, cette solution ne provoquerait-elle pas une génération inutile de nombres jusqu'à ce que l'on réponde à l'exigence d'unicité, en particulier dans les dernières itérations, si 8 était plus proche de 100? Je pense donc que je préfère la réponse également élégantesort
ci-dessous.Les techniques ci-dessus sont bonnes si vous voulez éviter une bibliothèque, mais selon si vous êtes d'accord avec une bibliothèque, je suggérerais de vérifier Chance pour générer des éléments aléatoires en JavaScript.
Plus précisément, pour résoudre votre question, utiliser Chance est aussi simple que:
Clause de non-responsabilité, en tant qu'auteur de Chance, je suis un peu partial;)
la source
var codes = chance.unique(chance.string, 8)
Si vous avez besoin des codes extraits d'un pool de caractères particulier, vous pouvez le spécifier comme ceci:chance.unique(chance.string, 8, {pool: "abcd1234"})
où abcd1234 peut être n'importe quel caractère du pool. Voir chancejs.com/#stringchance.string({ length: 8 })
et si vous voulez seulement que certains caractères apparaissent dans cette chaîne,chance.string({ pool: 'abcd1234', length: 8 })
ce qui renverrait une chaîne aléatoire de 8 caractères à partir des caractères abcd1234, donc par exemple "2c2c44bc" ou "331141cc"Pour éviter tout mélange long et peu fiable, je ferais ce qui suit ...
Voila - pas de nombres répétés.
Je pourrais publier du code plus tard, si quelqu'un est intéressé.
Edit: C'est probablement la séquence de compétition en moi mais, après avoir vu le message de @Alsciende, je n'ai pas pu résister à la publication du code que j'avais promis.
la source
Une autre approche consiste à générer un tableau de 100 éléments avec des nombres croissants et à le trier au hasard. Cela conduit en fait à un extrait de code très court et (à mon avis) simple.
la source
sort
soit bien implémenté, ce que je suis sûr que c'est).Je ferais ceci:
la source
C'est une fonction très générique que j'ai écrite pour générer des entiers aléatoires uniques / non uniques pour un tableau. Supposons que le dernier paramètre soit vrai dans ce scénario pour cette réponse.
Ici, le 'tempObj' est un obj très utile car chaque nombre aléatoire généré vérifiera directement dans ce tempObj si cette clé existe déjà, sinon, nous réduisons le i de un car nous avons besoin d'une exécution supplémentaire puisque le nombre aléatoire actuel existe déjà .
Dans votre cas, exécutez ce qui suit
C'est tout.
la source
min = (min) ? min : 1,
renvoie toujours 1. (donc 0 ne sera jamais sélectionné)Mélanger les nombres de 1 à 100 est la bonne stratégie de base, mais si vous n'avez besoin que de 8 nombres mélangés, il n'est pas nécessaire de mélanger les 100 nombres.
Je ne connais pas très bien Javascript, mais je pense qu'il est facile de créer rapidement un tableau de 100 null. Ensuite, pendant 8 tours, vous permutez le nième élément du tableau (n commençant à 0) avec un élément sélectionné aléatoirement de n + 1 à 99. Bien sûr, tout élément non encore rempli signifie que l'élément aurait vraiment été l'index d'origine plus 1, donc c'est facile à prendre en compte. Lorsque vous avez terminé avec les 8 tours, les 8 premiers éléments de votre tableau auront vos 8 nombres mélangés.
la source
plus court que les autres réponses que j'ai vues
la source
Même algorithme de permutation que The Machine Charmer, mais avec une implémentation prototypée. Mieux adapté à un grand nombre de pics. Utilise l' affectation de déstructuration js 1.7 si disponible.
Edit: Une autre proposition, mieux adaptée à un petit nombre de choix, basée sur la réponse de belugabob. Pour garantir l'unicité, nous supprimons les nombres sélectionnés du tableau.
la source
pour les tableaux avec des trous comme celui-ci
[,2,,4,,6,7,,]
car mon problème était de combler ces trous. Alors je l'ai modifié selon mes besoins :)la solution modifiée suivante a fonctionné pour moi :)
la source
La meilleure réponse antérieure est la réponse par
sje397
. Vous obtiendrez des nombres aléatoires aussi bons que possible, aussi vite que possible.Ma solution est très similaire à sa solution. Cependant, parfois, vous voulez les nombres aléatoires dans un ordre aléatoire, et c'est pourquoi j'ai décidé de publier une réponse. De plus, j'assure une fonction générale.
la source
Voici ma version ES6 que j'ai bricolée. Je suis sûr que cela peut être un peu plus consolidé.
la source
Que diriez-vous d'utiliser les propriétés d'objet comme table de hachage ? De cette façon, votre meilleur scénario est de ne randomiser que 8 fois. Ce ne serait efficace que si vous voulez une petite partie de la plage de nombres. Il est également beaucoup moins gourmand en mémoire que Fisher-Yates car vous n'avez pas à allouer d'espace pour un tableau.
J'ai alors découvert que Object.keys (obj) est une fonctionnalité ECMAScript 5, donc ce qui précède est pratiquement inutile sur les internets pour le moment. N'ayez crainte, car je l'ai rendu compatible ECMAScript 3 en ajoutant une fonction de touches comme celle-ci.
la source
la source
si vous avez besoin de plus d'unique, vous devez générer un tableau (1..100).
le code ci-dessus est plus rapide:
extractUniqueRandomArray (50) => [2, 79, 38, 59, 63, 42, 52, 22, 78, 50, 39, 77, 1, 88, 40, 23, 48, 84, 91, 49, 4, 54, 93, 36, 100, 82, 62, 41, 89, 12, 24, 31, 86, 92, 64, 75, 70, 61, 67, 98, 76, 80, 56, 90, 83, 44, 43, 47, 7, 53]
la source
Ajout d'une autre version améliorée du même code (réponse acceptée) avec la fonction JavaScript 1.6 indexOf. Vous n'avez pas besoin de parcourir tout le tableau à chaque fois que vous vérifiez le doublon.
La version plus ancienne de Javascript peut toujours utiliser la version en haut
PS: J'ai essayé de suggérer une mise à jour du wiki mais cela a été rejeté. Je pense toujours que cela peut être utile pour les autres.
la source
Voici ma solution personnelle:
Il génère au hasard 8 valeurs de tableau uniques (entre 0 et 7), puis les affiche à l'aide d'une boîte d'alerte.
la source
Je pense que cette méthode est différente des méthodes données dans la plupart des réponses, alors j'ai pensé que je pourrais ajouter une réponse ici (bien que la question ait été posée il y a 4 ans).
Nous générons 100 nombres aléatoires et étiquetons chacun d'eux avec des nombres de 1 à 100. Ensuite, nous trions ces nombres aléatoires étiquetés, et les étiquettes sont mélangées au hasard. Alternativement, au besoin dans cette question, on pourrait se passer de trouver simplement les 8 premiers des nombres aléatoires marqués. Trouver les 8 meilleurs articles coûte moins cher que de trier l'ensemble de la gamme.
Il faut noter ici que l'algorithme de tri influence cet algorithme. Si l'algorithme de tri utilisé est stable, il y a un léger biais en faveur de nombres plus petits. Idéalement, nous voudrions que l'algorithme de tri soit instable et même pas biaisé vers la stabilité (ou l'instabilité) pour produire une réponse avec une distribution de probabilité parfaitement uniforme.
la source
Cela peut gérer la génération d'un nombre aléatoire UNIQUE jusqu'à 20 chiffres
JS
jsFiddle
la source
Cette solution utilise le hachage qui est beaucoup plus performant O (1) que de vérifier si le réside dans le tableau. Il a également des contrôles plus sûrs. J'espère que ça aide.
la source
L'implémenter en tant que générateur le rend assez agréable à utiliser. Notez que cette implémentation diffère de celles qui nécessitent que le tableau d'entrée entier soit d'abord mélangé.
J'ai choisi d'implémenter
sample
d'une manière qui ne mute pas le tableau d'entrée, mais vous pourriez facilement affirmer qu'une implémentation en mutation est favorable.Par exemple, la
shuffle
fonction peut souhaiter muter le tableau d'entrée d'origine. Ou vous souhaiterez peut-être échantillonner à partir de la même entrée à différents moments, en mettant à jour l'entrée à chaque fois.sample
n'est plus une fonction pure à cause de la mutation d'entrée du tableau, mais dans certaines circonstances (démontrées ci-dessus), cela pourrait avoir plus de sens.Une autre raison pour laquelle j'ai choisi un générateur au lieu d'une fonction qui renvoie simplement un tableau est que vous souhaiterez peut-être continuer à échantillonner jusqu'à une condition spécifique.
Peut-être que je veux le premier nombre premier d'une liste de 1 000 000 de nombres aléatoires.
Parce que nous travaillons avec un générateur, cette tâche est triviale
Cela va échantillonner en continu 1 nombre aléatoire à la fois,
x
vérifier s'il est premier, puis revenirx
s'il l'est. Si la liste de nombres est épuisée avant qu'un premier ne soit trouvé,NaN
est retourné.Remarque:
Cette réponse a été partagée à l'origine sur une autre question qui a été fermée comme un double de celle-ci. Parce que c'est très différent des autres solutions proposées ici, j'ai décidé de le partager ici aussi
la source
la source
L'utilisation de a
Set
est votre option la plus rapide. Voici une fonction générique pour obtenir un aléatoire unique qui utilise un générateur de rappel. Maintenant, c'est rapide et réutilisable .la source
Il s'agit d'une implémentation de Fisher Yates / Durstenfeld Shuffle , mais sans création réelle d'un tableau, réduisant ainsi la complexité de l'espace ou la mémoire nécessaire, lorsque la taille de sélection est petite par rapport au nombre d'éléments disponibles.
Pour choisir 8 nombres parmi 100, il n'est pas nécessaire de créer un tableau de 100 éléments.
En supposant qu'un tableau est créé,
rnd
) de 1 à 100rnd
Si un tableau n'est pas créé, un hashMap peut être utilisé pour se souvenir des positions échangées réelles. Lorsque le deuxième nombre aléatoire généré est égal à l'un des nombres précédemment générés, la carte fournit la valeur actuelle à cette position plutôt que la valeur réelle.
la source
Voici un exemple de 5 nombres aléatoires pris dans une plage de 0 à 100 (0 et 100 inclus) sans duplication.
la source
Vous pouvez également le faire avec une seule doublure comme celle-ci:
[...((add, set) => add(set, add))((set, add) => set.size < 8 ? add(set.add(Math.floor(Math.random()*100) + 1), add) : set, new Set())]
la source