Vous avez conçu une fonction qui sélectionne aléatoirement les éléments d'un tableau, garantissant que les sélections récentes ne sont pas répétées. Bien que la solution actuelle fonctionne efficacement, vous avez des inquiétudes quant à son efficacité et si elle pourrait conduire à un bouclage excessif. Explorons une approche plus efficace.
1. Considérations sur la récursion
Oui, votre fonction ChooseName() peut être considérée comme récursive car elle s'appelle jusqu'à ce qu'elle trouve un nom unique. La récursivité peut être utile pour certains problèmes, mais il est important d'être conscient de l'utilisation de la pile et du potentiel de profondeur excessive.
2. Une solution efficace
Pour répondre aux problèmes d'efficacité, nous pouvons adopter une stratégie différente. Au lieu de compter sur la récursion et la boucle jusqu'à ce qu'un nom unique soit trouvé, nous pouvons créer une copie du tableau d'origine et sélectionner aléatoirement des éléments de la copie jusqu'à ce que tous les éléments soient sélectionnés. Une fois tous les éléments épuisés, nous réinitialisons la copie à son état d'origine.
Voici une implémentation JavaScript de 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']); console.log(chooser()); // => "Bar" console.log(chooser()); // => "Foo" console.log(chooser()); // => "Gah" console.log(chooser()); // => "Foo" -- only repeats once all items are exhausted.</code>
Cette approche utilise la méthode array slice() de JavaScript pour créer une copie superficielle du tableau d'origine. Il sélectionne ensuite à plusieurs reprises des éléments aléatoires de la copie et les supprime de la copie, imitant efficacement une sélection aléatoire sans répétition jusqu'à ce que tous les éléments soient épuisés. Une fois tous les éléments sélectionnés, la copie est réinitialisée, permettant à la sélection aléatoire de recommencer.
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!