web-dev-qa-db-fra.com

Comment mélanger les caractères d'une chaîne en JavaScript?

En particulier, je tiens à éviter toute erreur commise dans le code de lecture aléatoire de Browser Choice de Microsoft. C'est-à-dire que je veux m'assurer que chaque lettre a une probabilité égale de se retrouver dans toutes les positions possibles.

par exemple. Étant donné "ABCDEFG", retournez quelque chose comme "GEFBDCA".

35
Liam

J'ai modifié un exemple de l'entrée Fisher-Yates Shuffle sur Wikipedia pour mélanger les chaînes:

String.prototype.shuffle = function () {
    var a = this.split(""),
        n = a.length;

    for(var i = n - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    return a.join("");
}
console.log("the quick brown fox jumps over the lazy dog".shuffle());
//-> "veolrm  hth  ke opynug tusbxq ocrad ofeizwj"

console.log("the quick brown fox jumps over the lazy dog".shuffle());
//-> "o dt hutpe u iqrxj  yaenbwoolhsvmkcger ozf "

Vous trouverez plus d'informations dans La réponse de Jon Skeet à Est-il correct d'utiliser la méthode JavaScript Array.sort () pour le brassage?

67
Andy E

Si "vraiment" le hasard est important, je le déconseille. Voir mon ci-dessous éditer.

Je voulais juste ajouter ma méthode préférée pour un peu de variété;)

Étant donné une chaîne:

var str = "My bologna has a first name, it's O S C A R.";

Mélanger en une ligne:

var shuffled = str.split('').sort(function(){return 0.5-Math.random()}).join('');

Les sorties:

oa, a si'rSRn f gbomi. aylt AtCnhO ass eM
as'oh ngS li Ays.rC nRamsb Oo ait a ,eMtf
y alCOSf e gAointsorasmn bR Ms .' ta ih,a

EDIT: Comme @PleaseStand l’a fait remarquer, cela ne répond pas du tout à la question de OP, car elle souffre du code "Le choix du navigateur de Microsoft". Ce n'est pas un très bon randomiseur si votre chaîne doit être proche de aléatoire. Cependant, il est génial de "brouiller" rapidement vos chaînes, où le "vrai" caractère aléatoire n’est pas pertinent.

L'article qu'il lie ci-dessous est une excellente lecture, mais explique un cas d'utilisation complètement différent, qui affecte les données statistiques. Personnellement, je ne peux pas imaginer un problème pratique avec l’utilisation de cette fonction "aléatoire" sur une chaîne, mais en tant que codeur, vous êtes responsable de savoir quand pas l’utiliser.

J'ai laissé cela ici pour tous les randomiseurs occasionnels.

36
Joel Mellon

Même si cette question a été résolue, je voulais partager la solution que j'ai proposée:

function shuffelWord (Word){
    var shuffledWord = '';
    Word = Word.split('');
    while (Word.length > 0) {
      shuffledWord +=  Word.splice(Word.length * Math.random() << 0, 1);
    }
    return shuffledWord;
}

// 'Batman' => 'aBmnta'

Vous pouvez aussi l'essayer (jsfiddle) .

6
Maximilian Lindsey
String.prototype.shuffle=function(){

   var that=this.split("");
   var len = that.length,t,i
   while(len){
    i=Math.random()*len-- |0;
    t=that[len],that[len]=that[i],that[i]=t;
   }
   return that.join("");
}
0
user1289673
                  shuffleString = function(strInput){
                     var inpArr = strInput.split("");//this will give array of input string
                     var arrRand = []; //this will give shuffled array
                     var arrTempInd = []; // to store shuffled indexes
                     var max = inpArr.length;
                     var min = 0;
                     var tempInd;
                     var i =0 ;

                      do{
                           tempInd = Math.floor(Math.random() * (max - min));//to generate random index between range
                           if(arrTempInd.indexOf(tempInd)<0){ //to check if index is already available in array to avoid repeatation
                                arrRand[i] = inpArr[tempInd]; // to Push character at random index
                                arrTempInd.Push(tempInd); //to Push random indexes 
                                i++;
                            }
                       }
                        while(arrTempInd.length < max){ // to check if random array lenght is equal to input string lenght
                            return arrRand.join("").toString(); // this will return shuffled string
                        }
                 };

Il suffit de passer la chaîne pour fonctionner et obtenir en retour la chaîne mélangée

0
Mayur Nandane