Maison  >  Article  >  interface Web  >  Comment pouvons-nous sélectionner efficacement des éléments de tableau aléatoires sans répétition ?

Comment pouvons-nous sélectionner efficacement des éléments de tableau aléatoires sans répétition ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 10:41:40157parcourir

How Can We Efficiently Select Random Array Items Without Repetition?

Sélection aléatoire efficace des éléments du tableau sans répétition

Dans cet article, nous explorons un problème rencontré par les utilisateurs à la recherche d'une méthode efficace de sélection aléatoire éléments d'un tableau sans répétition. Le code fourni sélectionne efficacement les éléments mais introduit la possibilité d'une boucle infinie en raison de l'utilisation d'une fonction récursive.

Fonction récursive ?

La fonction ChooseName() peut être considéré comme récursif car il se réfère à lui-même dans sa définition. La condition de terminaison est la découverte d'un élément unique, où unique est défini sur false, rompant la boucle et recommençant l'appel de fonction.

Améliorer l'efficacité

Pour améliorer efficacité, nous considérons une approche alternative suggérée par le commentateur @YuriyGalanter. Au lieu de compter sur une fonction récursive, nous pouvons sélectionner aléatoirement des éléments du tableau et les stocker dans un tableau temporaire. Une fois tous les éléments sélectionnés, nous réinitialisons le tableau temporaire et poursuivons le processus de sélection aléatoire.

Mise en œuvre

La mise en œuvre ci-dessous intègre cette approche :

<code class="javascript">function randomNoRepeats(array) {
  var copy = array.slice(0);
  return function() {
    if (copy.length < 1) { copy = array.slice(0); }
    var index = Math.floor(Math.random() * copy.length);
    var item = copy[index];
    copy.splice(index, 1);
    return item;
  };
}

var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);
chooser(); // => "Bar"
chooser(); // => "Foo"
chooser(); // => "Gah"
chooser(); // => "Foo" -- only repeats once all items are exhausted.</code>

En utilisant cette fonction, les éléments peuvent être sélectionnés au hasard sans possibilité de boucle infinie tout en évitant le problème de répétition.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn