J'avais besoin recemment de desorganiser un tableau.
Par exemple j'avais
var tableau = new Array(0, 1, 2, 3, 4, 5);
et je voulais une fonction qui me mélange les nombres. En gros que {0, 1, 2, 3, 4, 5} deviennent {4, 3, 5, 0, 2, 1}
Pour cela j'ai utilisé la méthode sort de l'objet Array. Cette méthode attend en paramètre une fonction qui elle prend en paramètre 2 elements, puis cette fonction doit retourner un nombre negatif si la premier paramètre est inferieur au 2eme, 0 s'ils sont égaux, et un nombre supérieur à 1 s'il le premier est supérieur au second.
regardons un exemple :
tableau.sort(
function(elmt1, elmt2)
{
if (elmt1 < elmt2)
return -1;
else if( elmt1 == elmt2)
return 0;
else
return 1;
}
)
Donc pour desorganiser le tableau il faut que je retourne soit -1 soit 1. Voici le code permettant de faire ca : return ((2 * Math.round(Math.random())) - 1)
Une fois integré dans la fonction cela donne
tableau.sort(function(elmt1, elmt2) { return ((2 * Math.round(Math.random())) - 1) });
Le problème c'est que cette fonction n'est pas réutilisable il vous faut faire un copier coller pour desorganisé le tableau :/
C'est pas bien grave, etendons l'objet Array et rajoutons lui la méthode sortRandom()
if (!Array.prototype.sortRandom)
Array.prototype.sortRandom = function() { this.sort(function(elmt1, elmt2) { return ((2 * Math.round(Math.random())) - 1) }); }
Placer ce bout de code au début de votre fichier js, et vous pouvez dorenavant faire
var tableau = new Array(0, 1, 2, 3, 4, 5);
tableau.sortRandom();
alert(tableau[0]); // me renverra au hasard un des 6 chiffres du dessus.
Un autre problème c'est que ma méthode sortRandom modifie le tableau d'origine, et moi je voudrais bien que cela me renvoie un nouveau tableau.
Donc déjà il nous faut une fonction qui permet la duplication d'un tableau, on procede de la meme facon que tout à l'heure, en etendant l'objet Array.
if (!Array.prototype.duplicate)
Array.prototype.duplicate = function() { return [].concat(this);}
maintenant ajoutons la méthode getRandomlySort
if (!Array.prototype.getRandomlySort)
Array.prototype.getRandomlySort= function() { return this.duplicate().sortRandom();}
Source / Exemple :
if (!Array.prototype.duplicate)
Array.prototype.duplicate = function() { return [].concat(this);}
if (!Array.prototype.sortRandom)
Array.prototype.sortRandom = function() { this.sort(function(elmt1, elmt2) { return ((2 * Math.round(Math.random())) - 1) }); }
if (!Array.prototype.getRandomlySort)
Array.prototype.getRandomlySort= function() { return this.duplicate().sortRandom();}
Conclusion :
J'ai fait ces fonctions pour vous montrer le fonctionnement de la méthode sort :)
Éventuellement on peut utiliser la méthode suivante :
var tableau = new Array(0, 1, 2, 3, 4, 5);
function sortRandom(){
var copie = new Array().concat(tableau);
var taille = tableau.length;
for(var i=0; i<tableau.length; i++, taille--)
{
var elm = Math.floor(Math.random()*taille);
tableau.push(tableau[elm]);
tableau[elm] = tableau[0];
tableau.shift();
}
}
Cette fonction, après avoir copié le contenu du tableau dans "copie" :
-Sélectionne une case au hasard
-Ajoute son contenu à la fin du tableau
-Remplace cette case par le contenu de la première case
-Supprime la première case du tableau
Ainsi, on modifie le tableau initial d'une façon totalement aléatoire.
En effet la fonction sort va prendre le premier élément et le comparer au second.
S'il est plus grand on le compare au troisième et ainsi de suite.
Or le résultat de la comparaison a une chance sur deux d'être négatif.
Ce qui fait que ce premier élément a une chance sur deux d'être en première position, une sur quatre d'être en deuxième position, une sur huit d'être en troisième position,1/16...
Une solution originale est de permuter les éléments du tableau en les choisissant au hasard.
On choisit deux nombres aléatoires compris entre 0 et la taille tu tableau-1
on permute les éléments du tableau correspondant à ces indices.
On fait tourner la onction un certain nombre de fois afin que tous les éléments aient pu être mélangés.
Une autre solution serait de piocher dans le tableau un élément dont l'indice est choisi au hasard et de le mettre à la fin d'un nouveau tableau; on l'enlève de notre tableau et on repioche un élément jusqu'à ce que le tableau soit vide.
Juste une petite précision concernant ta source. Tu dis que la fonction n'est pas réutilisable lorsqu'elle est utilisé directement dans le sort(). Et c'est effectivement vrai sauf qu'il n'est pas nécessaire de mettre la fonction dans le sort. Il sufit de l'appeler avec son nom. Un exemple :
function sortRandom(elmt1, elmt2)
{
return ((2 * Math.round(Math.random())) - 1)
}
var tableau = new Array(0, 1, 2, 3, 4, 5);
// pour faire la copie
copie = new Array().concat(tableau)
// pour trier
tableau.sort(sortRandom);
alert(tableau);
alert(copie)
Donc le prototypage n'étaient pas nécessaire pour ne pas avoir a dupliquer la fonction. C'était tout de même un bon exercice de ta part.
9/10
A+
Félicitation
Fred
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.