La cueillette des 2 éléments aléatoires à partir de la matrice de
Quel est le moyen le plus efficace de sélectionner 2 unique aléatoire des éléments d'un tableau (c'est à dire, assurez-vous que le même élément n'est pas sélectionné à deux reprises).
J'ai jusqu'à présent:
var elem1;
var elem2;
elem1 = elemList[Math.ceil(Math.random() * elemList.length)];
do {
elem2 = elemList[Math.ceil(Math.random() * elemList.length)];
} while(elem1 == elem2)
Mais souvent, cela se bloque mon chargement de la page.
Une meilleure solution?
Question supplémentaire, comment puis-je étendre à n
éléments
OriginalL'auteur zsquare | 2012-03-15
Vous devez vous connecter pour publier un commentaire.
ne PAS utiliser des boucles et des comparaisons. Au lieu de cela
certainement. De l'autre côté, il serait intéressant de savoir exactement comment beaucoup plus lent pour la façon dont les grandes baies. Soins à jsperf?
Mon tableau est assez grand (+de 500 objets), comme @Dogbert dit, ne serait pas que cette approche soit moins efficace?
En disant: "500 objets n'est pas important du tout", c'est comme dire "500 longueurs de chaîne ne sont pas très long".
Je ne comprends pas ce que vous avez dit.
OriginalL'auteur georg
http://underscorejs.org/#sample
À la recherche à la source qu'il utilise shuffle tout comme @thg435 suggéré.
sampleSize
méthodeOriginalL'auteur Michal Stefanow
Votre code se bloque lorsque la liste contient un seul élément. Au lieu d'utiliser
==
, je recommande d'utiliser===
, qui semble plus approprié dans ce cas.Aussi, l'utilisation
Math.floor
au lieu deMath.ceil
. Lelength
propriété est égale à<highest index> + 1
.Aussi, les idées de comment l'étendre à la cueillette des
n
éléments aléatoires?Le code et l'algorithme est similaire à celui de Génération de nombres aléatoires (entiers) entre 0 'et'x'
OriginalL'auteur Rob W
Sur ce que Rob W vous l'ai dit, je vais ajouter qu'une autre solution serait de trouver un point au hasard et pour le deuxième point de trouver un décalage aléatoire du point:
Nous ajoutons 1 parce que l'élément en cours ne peut pas être resélectionnés et soustrayez 1 parce qu'un élément a déjà été sélectionné.
Par exemple, un tableau de trois éléments (0, 1, 2). Nous choisissons au hasard de l'élément 1. Maintenant, la "bonne" valeur de décalage sont 0 et 1, avec un décalage de 0 donnant l'élément 2 et un décalage de 1 donnant l'élément 0.
Noter que ce sera vous donner deux éléments aléatoires avec d'INDICE différent, pas avec une VALEUR différente!
Pas de tout cycle. Il va donner un bon couple d'éléments en constante déterministe du temps. Et je considère qu'il est plus élégant 🙂 🙂 Mais, en vérité, rien de vraiment important. La vitesse n'est pas un problème dans ce cas.
Upvotes constante déterministe en temps 🙂
il y a une erreur, même si,
(elem1 + 1 + Math.floor(Math.random() * (elemListLength - 1))) % elemListLength
elem1
est un objet, vous avez besoin pour économiser de l'ancienne index au lieuDroit corrigé
OriginalL'auteur xanatos
Si vous souhaitez obtenir
n
éléments aléatoires, vous pouvez créer une mélangées version de votre liste et ensuite de retour à la premièren
éléments de la mélangées groupe comme une raison.Cela dépend de la valeur de n par rapport à la taille de votre tableau. Si ils sont presque les mêmes puis brassage sera probablement plus rapide.
mon tableau est 500 plus, et j'ai besoin de 2 éléments 🙂
OriginalL'auteur sietschie
Il peut être fait à l'aide d'une fonctionnalité intégrée (tranche et tri),
OriginalL'auteur Mehdi Dehghani
Si vous shuffle le tableau et d'en réunir le nombre d'éléments que vous voulez retourner,
la valeur de retour va contenir autant d'éléments qu'il le peut,
si vous demandez plus d'éléments dans le tableau.
Vous pouvez mélanger le tableau réel ou d'une copie, avec slice().
Si vous souhaitez supprimer les éléments sélectionnés à partir du tableau d'origine,
de sorte qu'un deuxième appel ne comprennent pas les éléments du premier appel renvoyé,
passer un deuxième argument: getRandom(3,true);
OriginalL'auteur kennebec