webentwicklung-frage-antwort-db.com.de

Wie mische ich die Zeichen in einer Zeichenfolge in JavaScript?

Ich möchte insbesondere sicherstellen, dass der Fehler vermieden wird, der im Browser-Shuffle-Code von Browser gemacht wurde. Das heißt, ich möchte sicherstellen, dass jeder Buchstabe mit gleicher Wahrscheinlichkeit in jeder möglichen Position landet.

z.B. Geben Sie bei "ABCDEFG" etwas wie "GEFBDCA" zurück.

35
Liam

Ich habe ein Beispiel aus dem Fisher-Yates-Shuffle-Eintrag in Wikipedia geändert , um Strings zu mischen:

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 "

Weitere Informationen finden Sie in Jon Skeets Antwort to Ist es richtig, die Methode JavaScript Array.sort () für das Mischen zu verwenden?

67
Andy E

Wenn "wirklich" Zufälligkeit wichtig ist, empfehle ich dagegen. Siehe meine untenstehende Bearbeitung.

Ich wollte nur meine Lieblingsmethode für ein wenig Abwechslung hinzufügen;)

Eine Zeichenfolge gegeben:

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

Mischen in einer Zeile:

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

Ausgänge:

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

BEARBEITEN: Wie @PleaseStand hervorgehoben hat, entspricht dies nicht der Frage von OP, da sie unter dem "Microsoft Browser Choice Shuffle" -Code leidet. Dies ist kein sehr guter Randomizer, wenn Ihre Zeichenfolge nahezu zufällig sein muss. Es ist jedoch fantastisch, wenn Sie Ihre Saiten schnell "durcheinander bringen", wo "wahre" Zufälligkeit irrelevant ist.

Der Artikel, den er unten verlinkt, ist eine großartige Lektüre, erklärt jedoch einen völlig anderen Anwendungsfall, der statistische Daten beeinflusst. Ich persönlich kann mir kein praktisches Problem bei der Verwendung dieser "Zufalls" -Funktion für eine Zeichenfolge vorstellen, aber als Codierer sind Sie dafür verantwortlich zu wissen, wann not diese Funktion verwendet.

Ich habe das hier für alle zufälligen Randomizer gelassen.

36
Joel Mellon

Obwohl dies beantwortet wurde, wollte ich die Lösung mitteilen, die ich mir ausgedacht hatte:

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'

Sie können auch probieren Sie es aus (jsfiddle) .

6
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
                        }
                 };

Übergeben Sie einfach den String an die Funktion und erhalten Sie den gemischten String

0
Mayur Nandane

Eine andere Art, ein Wort zu verschlüsseln. Alle anderen Antworten mit genügend Iterationen geben das Wort unverschlüsselt zurück, meine nicht.

var scramble = Word => {

    var unique = {};
    var newWord = "";
    var wordLength = Word.length;

    Word = Word.toLowerCase(); //Because why would we want to make it easy for them?

    while(wordLength != newWord.length) {

        var random = ~~(Math.random() * wordLength);

        if(

          unique[random]
          ||
          random == newWord.length && random != (wordLength - 1) //Don't put the character at the same index it was, nore get stuck in a infinite loop.

        ) continue; //This is like return but for while loops to start over.

        unique[random] = true;
        newWord += Word[random];

    };

    return newWord;

};

scramble("God"); //dgo, gdo, ogd
0
Darkrum

Wenn Sie so auf der Suche nach ordentlichen und schönen Einzeilern sind wie ich, könnte Ihnen meine ES6-Implementierung gefallen:

const str = 'ABCDEFG';

const shuffle = str => [...str].reduceRight((res,_,__,arr) => [...res,arr.splice(~~(Math.random()*arr.length),1)[0]],[]).join('');

console.log(shuffle(str));
0