Maison > interface Web > js tutoriel > Comment puis-je sélectionner efficacement des éléments aléatoires dans un tableau sans répétition, en particulier lorsque le tableau est constamment modifié ?

Comment puis-je sélectionner efficacement des éléments aléatoires dans un tableau sans répétition, en particulier lorsque le tableau est constamment modifié ?

Susan Sarandon
Libérer: 2024-11-01 17:16:02
original
588 Les gens l'ont consulté

How can I efficiently select random items from an array without repetition, especially when the array is constantly being modified?

Sélection aléatoire efficace dans un tableau

Introduction

La sélection aléatoire d'un élément dans un tableau sans répétition est une programmation courante tâche. Cependant, si le pool d'éléments est constamment modifié, garantir l'efficacité devient crucial.

Question

Un développeur a implémenté une fonction permettant de sélectionner aléatoirement un élément dans un tableau. tout en maintenant une liste de choix récents pour éviter les répétitions. Cependant, ils expriment des inquiétudes quant à son efficacité et demandent s'il existe une approche plus optimale.

Réponse

1. Clarification de la récursion

Le code fourni semble en effet être une fonction récursive. La récursivité implique une fonction qui s'appelle elle-même, ce qui peut conduire à des inefficacités dans certains scénarios.

2. Amélioration de l'efficacité

Pour améliorer l'efficacité, envisagez l'approche alternative suivante :

  1. Créez une copie de la baie d'origine. Cela garantit que la baie d'origine reste intact.
  2. Définissez une fonction qui sélectionne aléatoirement un élément de la copie.
  3. Lorsque la copie est épuisée, réinitialisez-la en créant une nouvelle copie à partir de le tableau d'origine.

Mise en œuvre du code :

<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']);</code>
Copier après la connexion

Explication :

Cette approche isole la logique de sélection aléatoire du code responsable de la gestion de l'ensemble des choix récents. En conséquence, l'efficacité est améliorée car la sélection aléatoire n'a lieu qu'une seule fois par exécution de la fonction de sélection.

En réinitialisant la copie chaque fois qu'elle est épuisée, la fonction garantit que tous les éléments ont une chance égale d'être sélectionnés. Cela élimine le problème potentiel de blocage du code dans une boucle infinie en essayant de trouver un nom « unique ».

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal