L'algorithme de brassage est un problème aléatoire courant que nous rencontrons souvent lors des jeux et du tri aléatoire. Cela peut être résumé comme ceci : obtenez un tableau de séquences aléatoires de tous les nombres naturels dans M.
En recherchant "Shuffling Algorithm" sur Baidu, le premier résultat est "Baidu Library-Shuffling Algorithm". Après avoir analysé le contenu, de nombreux contenus peuvent facilement induire les autres en erreur, y compris l'utilisation de listes chaînées au lieu de tableaux à la fin. . Il ne s'agit également que d'une optimisation limitée (les listes chaînées introduisent également une perte d'efficacité en lecture).
La première méthode de cet article peut être simplement décrite comme : piochez des cartes au hasard et placez-les dans un autre groupe ; si vous piochez une carte vide, répétez le tirage.
"Si vous piochez une carte vide, piochez-la à nouveau." Cela augmentera les chances de piocher une carte vide plus tard, ce qui est évidemment déraisonnable.
Il peut être optimisé en une seule étape : une fois les cartes supprimées, les cartes originales seront réduites. (Au lieu de laisser une carte vide)
Le code est le suivant :
//Piochez une carte à chaque fois et mettez-la dans une autre pile. Étant donné que vous devez extraire des éléments du tableau et avancer d'un élément tous les éléments suivants, cela prend beaucoup de temps.
var arr2 = new Array();
for (var i=m; i>0; i--) {
var rnd = Math.floor(Math.random()*i);
arr2.push(arr[rnd]);
arr.splice(rnd,1);
}
return arr2;
}
C'est aussi évidemment problématique, car si le tableau est très grand, la suppression d'un élément au milieu fera avancer la file d'attente suivante, ce qui est une action très longue.
Rappel "Pourquoi veut-on supprimer cet élément ?" Le but n'est pas de produire des cartes vides.
En plus de supprimer cet élément, existe-t-il d'autres moyens pour nous de supprimer les cartes vides ?
----Oui, on vient de mettre la dernière carte non tirée en position tirée.
Donc, on peut optimiser cette idée comme ceci :
//Piochez une carte à chaque fois et mettez-la dans une autre pile. Placez la dernière carte non tirée sur le siège vide.
var arr2 = new Array();
for (var i=m; i>0;) {
var rnd = Math.floor(Math.random()*i);
arr2 .push(arr[rnd]);
arr[rnd] = arr[--i];
}
return arr2;
}
//Échangez la i-ème carte avec n'importe quelle carte après un tour
pour (var i=0; i
temp = arr[rnd];
arr[rnd] = arr[i];
arr[i]=temp;
}
return arr;
}
En plus de l'idée de piocher et d'échanger des cartes, on peut aussi utiliser l'idée d'insérer des cartes : il y a d'abord une carte, la deuxième carte a deux positions qui peuvent être insérées aléatoirement (avant ou après la première carte), et la troisième Il y a trois positions pour qu'une carte soit insérée aléatoirement (au dos, ou en première place, ou en deuxième place), et ainsi de suite
Le code est le suivant :
Le code ci-dessus aura également quelques problèmes : à mesure que le nombre de cartes augmente, il devient de plus en plus difficile d'insérer des cartes, car l'insertion de cartes entraînera le refoulement de nombreuses cartes suivantes.
Bien sûr, on peut aussi l'optimiser de manière appropriée : il y a n-1 cartes en premier, la n-ème carte est placée à la fin, puis elle échange ses positions avec n'importe quelle carte.
Le code est le suivant :
D'accord, l'ensemble du code est le suivant. Les étudiants intéressés peuvent l'essayer sur leurs propres machines pour voir leur efficacité d'exécution respective et si le résultat final est théoriquement aléatoire.