Random d'un tableau

Soyez le premier à donner votre avis sur cette source.

Snippet vu 26 013 fois - Téléchargée 18 fois

Contenu du snippet

Hello Every <BODY>

La demande se faisant sentir sur le forum, je vous livre une fonction permettant le tri aléatoire d'un tableau.
Cela aurait pu être un prototype au Array mais la je vous laisse faire.

L'exemple est fourni avec un tableau de nombre, mais tout tableau fait l'affaire.

Bonne utilisation
;O)

Source / Exemple :


<html>
<head>
<title>Tri aléatoire d'un tableau</title>
<style type="text/css">
body{
  font-size : 13px;
  font-family : Verdana;
  margin : 10px;
}
</style>
<script type="text/javascript">
//-------------------------------
// entree : le tableau a randommer
// sortie : le tableau randomme
//-------------------------------
function Rand_Tableau( tab_){
  var i;
  var Num;
  var Nbr = tab_.length;
  var Tab = new Array();
  //-- Copie le contenu
  Tab = Tab.concat(tab_);
  //-- Lance la boucle
  while( Nbr> 0){
    //-- Recup nombre aleatoire
    Num = Math.floor(Math.random() * Nbr);
    //-- 1 de moins a traiter
    Nbr--;
    //-- Stock l'element tire
    szTmp = Tab[Num];
    //-- Decalage les valeur du tableau
    for( i= Num; i < Nbr; i++)
      Tab[i] = Tab[i+1]
    //-- Stock l'element tire en fin
    Tab[ Nbr] = szTmp;
  }
  //-- On peut remettre dans l'ordre du tirage
  Tab.reverse();
  //-- Retourne resultat
  return( Tab);
}
//------------------
// Just for Test
//------------------
function Fct_Test(){
  var Html ="";
  var Tab = new Array();
  //-- Init du Tableau
  for( var i =0; i < 10; i++)
    Tab[i] = i;
  //-- Random du tableau
  Tab = Rand_Tableau( Tab);
  //-- Fomattage sortie
  for( var i=0; i < Tab.length; i++)
    Html += Tab[i] +"   "
  //-- Affichage resultat
  document.getElementById('D_RESULT').innerHTML += "<br>" +Html;
}
</script>
</head>
<body>
<h3>Tri aléatoire d'un tableau</h3>
<input type = "button" value = "Lance" onclick = "Fct_Test();">
<div id = "D_RESULT"></div>
</body>
</html>

Conclusion :


Objet modif 1:
j'ai remis les lignes clearées un peu vite dans la source concernant la copie du contenu du fichier afin que le tableau en entrée ne soit pas modifié.

vous pouvez donc faire un appel
Tab_1 = Ran_Tableau( Tab_0);

A voir également

Ajouter un commentaire Commentaires
Messages postés
450
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
18 avril 2007
2
Re-bravo( je m'en lasse pas ;)).
Je suis surtout content car j'essayer sans succès de sortir une source de ce genre (pourtant au fonctionnement simple)...
Messages postés
450
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
18 avril 2007
2
d'accord, array.sort mélange selon si on retourne -1,0 ou 1. mais comment utilise-t-il ces chiffres ? il déplace les valeur ? en tout cas moi je trouve cette source très utile. 11/10 ;)(déja voté dommage)
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
"pas juste une fonction abstraite dont on ne connait pas le fonctionnement"

Abstrait ? Le fonctionnement est très simple, la méthode sort est utilisé pour trié un tableau, mais on peut dire avec quel fonction on veut qu'il trie le tableau. Dans cette fonction si on fait qu'il retourne true ou false (1 ou 2, c'est le pourquoi du Math.round) de façon aléatoire le tableau va être mélangé d'une certaine façon.

J'ignorais jusqu'à quel point cette méthode pouvait être efficace, mais il semble quel à des défaults. Pour la rapidité, des deux fonctions le fait que la méthode sort soit built-in donne un avantage sur de plus long de tableau. Pour le reste je comprends plus ou moins ce que tu veux montrer, mais il semble que la méthode avec le sort donne des résultats moins aléatoires, c'est probablement du à la méthode qui est utilisé built-in pour trié les tableaux.
Messages postés
450
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
18 avril 2007
2
Merci PetoleTeam, je cherchai justement un code comme ça, sans passer par la méthode de jesusonline, un bout de code qui mélange, pas juste une fonction abstraite dont on ne connait pas le fonctionnement. 10/10
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
Bonjour Arto_8000,
plus simple surement MAIS...
Il y a deux aspects à considérer,

je commence par la vitesse même si ce n'est pas forcément ce que je privilégie, je préfère un code clair à un code moins lisible qui présente une rapidité à peine meilleure.

Jusqu'à des tableaux de 70 éléments la méthode SORT ARRAY est moins rapide mais prend l'avantage au delà.
Pour en finir avec la vitesse on notera que Opera sort toujours en tête devant IE et FireFox.
Mais je le répète ce n'est pas le point le plus important.

Le point le plus important reste la fréquence d'apparition des éléments du tableau.
En faisant un mélange de ce type je m'attend à ce que chaque élément est la même chance de se retrouver à toutes les places et ce à chaque tirage.
J'ai réalisé un test, 100000 passages sous IE, sur les deux routines et la à ma grande stupéfaction la méthode SORT ARRAY est catastrophique.

Ci dessous le tableau des résultats, je pense que cela ne sera pas très lisible mais bon.
- en ordonnée la position en entrée dans le tableau
- en abscisse la position en sortie dans le tableau
pour SORT ARRAY
04859;04847;04278;04711;05968;06477;04986;06045;07655;50174
09020;09176;09412;09359;05896;06809;10241;11711;15821;12555
08438;08313;06364;07684;16083;15224;07113;08305;10138;12338
13968;13642;18359;05952;05990;06499;15609;13866;02992;03123
10587;10633;09071;20296;05245;05709;05329;05937;24085;03108
11233;11389;08559;10331;30924;04919;05110;05444;05841;06250
08698;08637;06991;08160;10785;33779;05297;05418;05992;06243
12393;12261;15210;06610;07058;07758;34081;01492;01550;01587
10472;10777;13028;06258;06586;07110;06818;35842;01556;01553
10332;10325;08728;20639;05465;05716;05416;05940;24370;03069
- mini = 1492
- maxi = 50174 soit un chance sur deux au lieu d'un sur dix !
- ecart-type = 7790

pour Rand Tableau
09980;10209;09921;09918;09999;09966;10015;10125;09914;09953
09927;10024;09899;09968;10029;10136;09881;10061;10097;09978
09817;10050;10127;09919;09953;09923;10033;10038;09930;10210
09873;09913;09958;10140;10046;10024;10192;09984;09982;09888
10025;10002;10078;09952;09873;09959;10006;10017;10221;09867
10216;10127;09905;09961;09946;09941;09911;10057;10020;09916
10036;09893;09909;10033;10171;10011;10037;09895;09893;10122
09885;10016;10075;10048;10040;10040;10096;10025;09830;09945
10161;09897;10088;09990;09966;09978;10003;09947;10015;09955
10080;09869;10040;10071;09977;10022;09826;09851;10098;10166
- mini = 9817
- maxi = 10221
- ecart-type = 95
Y PAS PHOTO !!!

Donc plus simple peut être mais pas très efficace si l'on veut un tirage aléatoire.

Je pense que plus que la méthode SORT il s'agit plutôt du Math.round qui n'est pas judicieux.

Si cela intéresse je pourrais mettre la page de test dans un ZIP.
;0)
Afficher les 6 commentaires

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.