2010-10-15 9 views
30

In particolare, voglio essere sicuro di evitare l'errore commesso nel codice shuffle di Microsoft Browser Choice. Cioè, voglio assicurarmi che ogni lettera abbia la stessa probabilità di finire in ogni posizione possibile.Come faccio a mescolare i caratteri in una stringa in JavaScript?

ad es. Dato "ABCDEFG", restituisce qualcosa come "GEFBDCA".

risposta

54

Ho modificato un esempio dal Fisher-Yates Shuffle entry on Wikipedia per mischiare le stringhe:

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 " 

Maggiori informazioni si possono trovare in Jon Skeet's answer-Is it correct to use JavaScript Array.sort() method for shuffling?.

+0

Grazie, questo è decisamente più uniforme di altri esempi che ho trovato. – Liam

32

Se "veramente" casualità è importante, mi raccomando contro questo. Vedi la mia modifica qui sotto.

Volevo solo aggiungere il mio metodo preferito per un po 'di varietà;)

Data una stringa:

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

Shuffle in una sola riga:

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

Uscite:

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: Come @PleaseStand ha sottolineato, questo non soddisfa la domanda di OP a tutti dal momento che soffre di codice "Browser Choice riordino di Microsoft". Questo non è un buon randomizzatore se la tua stringa deve essere vicina al caso. È comunque fantastico creare rapidamente "confuse" le tue corde, dove la "vera" casualità è irrilevante.

L'articolo si collega sotto è un grande letto, ma spiega un caso d'uso del tutto diverso, che colpisce i dati statistici. Personalmente non riesco a immaginare un problema pratico con l'uso di questa funzione "casuale" su una stringa, ma come programmatore, sei responsabile di sapere quando non è utilizzare questo.

Ho lasciato questo qui per tutti i sistemi randomizer occasionali là fuori.

+0

-1: questo ha l'esatto "errore commesso nel codice shuffle di Microsoft Browser Choice." http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html – PleaseStand

+1

@PleaseStand Hai assolutamente ragione. Ho sempre saputo che questo è un trucco piuttosto pigro che in realtà non produce risultati molto casuali. Aggiornerò la mia risposta, anche se non direi che è l '"errore esatto", ovvero per i risultati del sondaggio. –

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

Basta passare la stringa di funzionare e in cambio ottenere la stringa mescolate

+1

aggiungi un esempio su come passare. –

5

Anche se questo è stato risposto, ho voluto condividere la soluzione mi è venuta:

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' 

È anche possibile try it out (jsfiddle).

-2
String.prototype.shuffle = function(){ 
    return this.split('').sort(function(a,b){ 
    return (7 - (Math.random()+'')[5]); 
    }).join(''); 
}; 
+0

Rispondere a una domanda di 7 anni con codice non spiegato? – traktor53

+0

È solo un altro modo per scrivere [questa risposta] (https://stackoverflow.com/a/25419830/2350083)? – Jon

Problemi correlati