Maison  >  Article  >  interface Web  >  Exemple détaillé de la façon d'utiliser JavaScript pour randomiser l'index de valeur dans un tableau et créer un tableau aléatoire

Exemple détaillé de la façon d'utiliser JavaScript pour randomiser l'index de valeur dans un tableau et créer un tableau aléatoire

巴扎黑
巴扎黑original
2017-09-14 11:59:111511parcourir

L'exemple de cet article décrit la méthode de randomisation de l'index de valeur dans le tableau et de création d'un tableau aléatoire à l'aide de JavaScript. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :

Aujourd'hui dans le groupe de communication QW, j'ai vu des étudiants discuter de la question de la randomisation des tableaux. L'algorithme donné était très bon, et il m'a rappelé celui pas si "beau" que moi. avait mis en œuvre auparavant la méthode. Pensez-y, parfois, lorsque nous sommes occupés à écrire du code métier juste pour implémenter sa fonction, nous ne réfléchissons pas beaucoup à l'existence d'une meilleure méthode d'implémentation.

Pour ce problème de tableau (puis trier les valeurs dans un tableau et renvoyer un nouveau tableau), ma méthode d'implémentation précédente était comme ceci :

function randArr(arr) {
 var ret = [],
 obj = {},
 i = arr.length,
 l = i,
 n;
 while (--i >= 0) {
  n = Math.floor( Math.random() * l );
  if (obj[n] === void 0) {
   ret[ret.length] = obj[n] = arr[n];
  } else {
   i++;
  }
 }
 return ret;
}

Le code ci-dessus fonctionnera, mais ce n'est pas un bon algorithme. Il a l'intention d'exécuter la boucle "longueur du tableau d'origine". Chaque boucle sélectionnera au hasard un index dans le tableau d'origine, puis déterminera si l'index a été pris. Sinon, l'index le fera. be La valeur de est mise dans le nouveau tableau Si elle a été récupérée, la clé de décrémentation i sera incrémentée de 1 (le but est de répéter le cycle jusqu'à ce qu'un autre index non récupéré soit récupéré). La performance de cette méthode dépend de votre caractère. Je pense que les étudiants qui ont vu cette idée en comprendront la raison.

Donnez maintenant l'algorithme du camarade de classe du groupe :

function randArr(arr) {
 var ret = [],
 i = arr.length,
 n;
 arr = arr.slice(0);
 while (--i >= 0) {
  n = Math.floor( Math.random() * i);
  ret[ret.length] = arr.splice(n, 1)[0];
 }
 return ret;
}

C'est un algorithme assez intelligent après avoir pris un index aléatoire dans chaque boucle, et la valeur est supprimée du tableau. , de sorte que si l'index est toujours récupéré de manière aléatoire plus tard, l'index n'est plus la valeur récupérée la dernière fois et la plage de nombres aléatoires diminuera en fonction de la longueur du tableau, afin que vous puissiez faire un cycle un certain nombre de fois. en même temps et obtenez le résultat idéal.

J'ai également vu une version améliorée, qui prenait en compte certains problèmes de performances causés par l'opération de suppression du tableau et utilisait l'algorithme de brassage de JK, c'est-à-dire changer chaque opération de suppression en une opération de remplacement de position (La valeur de l'index obtenu est échangé avec la valeur correspondant à la clé de décrémentation actuelle i), afin que l'impact sur l'ensemble du tableau soit minime. Mettons le code :

function randArr(arr) {
 var ret = [],
 i = arr.length,
 n;
 arr = arr.slice(0);
 
 while (--i >= 0) {
  n = Math.floor( Math.random() * i);
  ret[ret.length] = arr[n];
  arr[n] = arr[i];
 }
 return ret;
}

Enfin, donnons un " "Créez un aléatoire. tableau avec une valeur comprise entre min~max", le principe de l'algorithme est similaire à celui ci-dessus :

function makeRandArr(min, max) {
 var ret = [],
 obj = {},
 n;
 for (; max >= min; max--) {
  n = Math.ceil( Math.random() * (max - min) ) + min;
  ret[ret.length] = obj[n] || n;
  obj[n] = obj[max] || max;
 }
 return ret;
}

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