ze_fred
Messages postés15Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 septembre 2007
-
25 août 2005 à 09:56
Sadlyness78
Messages postés1Date d'inscriptionsamedi 24 mars 2007StatutMembreDernière intervention10 juin 2010
-
10 juin 2010 à 15:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Sadlyness78
Messages postés1Date d'inscriptionsamedi 24 mars 2007StatutMembreDernière intervention10 juin 2010 10 juin 2010 à 15:34
Hum... oui on peut procéder ainsi, mais comme le signale tcherniatinsky, ça n'est pas un tri réellement aléatoire.
É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.
tcherniatinsky
Messages postés1Date d'inscriptionlundi 21 décembre 2009StatutMembreDernière intervention21 décembre 2009 21 déc. 2009 à 13:34
Il y a une erreur dans le tri.
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.
GhislainLavoie
Messages postés289Date d'inscriptionvendredi 11 mars 2005StatutMembreDernière intervention 3 avril 20083 30 août 2005 à 01:50
Salut jesusonline,
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 :
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+
zeratul67
Messages postés97Date d'inscriptionmardi 9 avril 2002StatutMembreDernière intervention11 mai 2008 25 août 2005 à 21:23
Simple, peu long, détaillé, très bonne source pour découvrir un peu plus le language :)
Félicitation
ze_fred
Messages postés15Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 septembre 2007 25 août 2005 à 09:56
Un bon tutorial qui depasse le cadre du sort et permet de montrer à ceux qui ne le save pas comment étendre les classes de base du javascript sans forcement faire de la délégation.
10 juin 2010 à 15:34
É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.
21 déc. 2009 à 13:34
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.
30 août 2005 à 01:50
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+
25 août 2005 à 21:23
Félicitation
25 août 2005 à 09:56
Fred