IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Mélanger un tableau sans sort


Sujet :

JavaScript

  1. #1
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut Mélanger un tableau sans sort
    Je suis à la recherche d'une discussion sur le forum ici qui expliquait pourquoi il ne faut pas utiliser sort pour mélanger un tableau mais après 30 minutes je ne l'ai pas trouvée.

    Dans mes archives, j'ai juste retrouvé le code à utiliser à la place :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function melange(tableau)
    {
     
    	let i, j, element;
     
    	i = tableau["length"];
     
    	while (i > 1) {
     
    		j = Math.floor(Math.random() * i--);
     
    		element = tableau[i];
    		tableau[i] = tableau[j];
    		tableau[j] = element;
     
    	}
     
     
    	return tableau;
     
    }

    et j'ai aussi le code qui permet de faire la comparaison et où on voit que le mélange avec "sort" n'est pas du tout équilibré :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    <script>
     
    function melange_DECONSEILLE(tableau)
    {
            return tableau.sort(e => 0.5 - Math.random());
    }
     
     
    function melange_PAS_RAPIDE(tableau)
    {
            var i;
            var j;
            var index;
            var tableau2;
     
            index = {};
            tableau2 = [];
            i = tableau.length;
            while (--i>=0) {
                    
                    while (index[j = Math.floor(Math.random()*tableau.length)]===true) {}
                    index[j]=true;
                    tableau2[i]=tableau[j];
                    
            }
            
            
            return tableau2;
            
    }
     
     
    function melange_ACCEPTABLE(tableau)
    {
            var i;
            var j;
            var tableau2;
     
            tableau2 = [];
            i = tableau.length;
            while (--i >= 0) {
                    
                    tableau2[i] = tableau[j = Math.floor(Math.random()*(i+1))];
                    tableau.splice(j,1);
                    
            }
            
            
            return tableau2;
            
    }
     
     
    function melange_TROP_BIEN(tableau)
    {
            
            let i, j, element;
            
            i = tableau["length"];
            
            while (i > 1) {
                    
                    j = Math.floor(Math.random() * i--);
                    
                    element = tableau[i];
                    tableau[i] = tableau[j];
                    tableau[j] = element;
                    
            }
            
            
            return tableau;
            
    }
     
     
    //////////////////////////////////////////////////////////////////////////////////////////////////
    // comparaison des méthodes
     
    function test(fonction_melange)
    {
            let tableau;
            let valeurs = ["A", "B", "C"];
            
            console.time(fonction_melange);
            
            let verification = {};
            let i = 100000 * fact(valeurs["length"]);
            
            while (--i >= 0) {
                    
                    tableau = window[fonction_melange]([...valeurs]);
                    
                    verification[tableau] = !(tableau in verification) ? 1 : verification[tableau] + 1;
                    
            }
            
            console.timeEnd(fonction_melange);
            
            affiche_resultat(verification);
            
    }
     
    function affiche_resultat(verification)
    {
            
            let cles = [];
            let somme = 0;
            
            
            for (const cle in verification) {
                    cles.push(cle);
                    somme += verification[cle];
            }
            
            let moyenne = Math.floor(somme / cles.length);
            
            cles.sort();
            
            cles.forEach(cle => {
                    
                    let diff = verification[cle] - moyenne;
                    
                    console.log(cle + " : " + verification[cle] + " (" + diff + ", " + (diff / moyenne * 100).toFixed(1) + " %)");
                    
            });
            
            
            console.log("=== moyenne : " + moyenne + " ===");
            
            
    }
     
    function fact(nbr) 
    {
            // Si nbr = 0 la factorielle retournera 1
            if (nbr === 0) {
                    return 1;
            }
            // appelez à nouveau la procédure récursive
            return nbr * fact(nbr - 1);
    }
     
     
    test("melange_DECONSEILLE"); // mélange déséquilibré
    test("melange_PAS_RAPIDE");  // performances : risquées, toutes les combinaisons possibles : oui, probabilités identiques : oui.
    test("melange_ACCEPTABLE");  // performances : moyennes, toutes les combinaisons possibles : oui, probabilités identiques : oui.
    test("melange_TROP_BIEN");   // performances : bien,     toutes les combinaisons possibles : oui, probabilités identiques : oui.
     
     
    </script>

    Donc si quelqu'un sait comment retrouver cette discussion, ça permettrai de rendre à César ce qui lui appartient.
    Ou alors si vous savez expliquer pourquoi l'utilisation de sort produit cela, lancez vous

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    peut-être fais tu allusion à :

    ou encore à :

    ... il faut regarder du côté des interventions de Loralina

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    on avance en effet, dans la 2e discussion se trouve le code de test des différents algorithmes.

    mais j'ai l'impression qu'il y avait encore un autre message qui expliquait que "sort" fait des permutations ou quelque chose comme ça. et là je viens de commencer à regarder dans la liste des messages de Loralina mais je n'ai pas encore trouvé.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Citation Envoyé par mathieu
    mais j'ai l'impression qu'il y avait encore un autre message qui expliquait que "sort" fait des permutations ou quelque chose comme ça
    pourrais-tu préciser, l'algo de sort est défini dans ECMAScript® 2023 Language*Specification

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    pourrais-tu préciser
    justement je ne sais plus quel mots étaient utilisé, j'ai fait des recherches sur "tri mélange shuffle" et je ne l'ai pas retrouvé.

    Citation Envoyé par NoSmoking Voir le message
    l'algo de sort est défini dans ECMAScript® 2023 Language*Specification
    quand on déroule ça, on arrive au point 5 qui indique que l'algorithme tri est défini par une "source externe" donc ça dépend peut-être des navigateurs ?
    https://tc39.es/ecma262/multipage/in...exedproperties

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Il me semble effectivement qu'à une époque cela dépendait du navigateur, son moteur JS, mais je ne pense plus que ce soit le cas.

    Par contre on peut encore lire sur MDN : Différences d'implémentation.

    Concernant les sources pour FireFox j'ai retrouvé ceci

    c'est un peu en vrac ... si cela te dit !

    Pas fait la recherche pour Chrome.

Discussions similaires

  1. Trier un tableau() as integer sans Sort - Deux méthodes testées
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 25/10/2008, 22h52
  2. Réaliser un tableau sans tracer de lignes
    Par youp_db dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 5
    Dernier message: 13/01/2006, 09h14
  3. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 12h43
  4. [HTML] Tableau sans departagement des cellules
    Par nimport nawak dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/05/2005, 17h58
  5. [HTML / CSS ... ?] Tableau sans AUCUNE marge
    Par PierrotY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/04/2005, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo