Maison >interface Web >js tutoriel >Comment randomiser l'index de valeur dans un tableau et créer un tableau aléatoire à l'aide des compétences javascript_javascript

Comment randomiser l'index de valeur dans un tableau et créer un tableau aléatoire à l'aide des compétences javascript_javascript

WBOY
WBOYoriginal
2016-05-16 15:46:151096parcourir

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é la méthode pas si "belle" que j'avais mise en œuvre auparavant. 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.

En ce qui concerne 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 la suivante :

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 choisira au hasard un index dans le tableau d'origine, puis déterminera si l'index a. Si ce n'est pas le cas, placez la valeur de l'index dans le nouveau tableau. Si tel est le cas, augmentez la touche de décrémentation i de 1 (le but est de répéter le cycle jusqu'à ce qu'un autre index qui n'a pas été 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 de l'élève 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 chaque boucle, un index aléatoire est pris et sa valeur est supprimée du tableau, de cette façon, si l'index est toujours pris au hasard plus tard, l'index n'est plus la valeur. obtenu la dernière fois, et la plage de nombres aléatoires diminuera en fonction de la diminution de la longueur du tableau, de sorte que le résultat idéal puisse être obtenu en bouclant un certain nombre de fois à la fois.

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 récupérée de ceci index est interchangé avec la valeur correspondant à la clé de décrémentation actuelle i), de sorte que l'impact sur l'ensemble du tableau soit minime, mettons donc 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, une méthode de « création d'un tableau aléatoire avec une valeur comprise entre min~max » est donnée. 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;
}

J'espère que cet article sera utile à la conception de la programmation JavaScript de chacun.

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