2010-10-15 18 views
30

W szczególności, chcę się upewnić, że omyłkowo popełniono błąd w kodzie losowym przeglądarki Microsoft Choice. Chodzi o to, że chcę się upewnić, że każda litera ma równe prawdopodobieństwo, że znajdzie się w każdej możliwej pozycji.Jak mogę przetasować znaki w łańcuchu w JavaScript?

np. Biorąc pod uwagę "ABCDEFG", zwróć coś w stylu "GEFBDCA".

Odpowiedz

54

zmodyfikowałem przykład z Fisher-Yates Shuffle entry on Wikipedia shuffle ciągi:

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 " 

Więcej informacji można znaleźć w Jon Skeet's answer do Is it correct to use JavaScript Array.sort() method for shuffling?.

+0

Dzięki temu jest zdecydowanie bardziej jednolity niż inne przykłady, które znalazłem. – Liam

32

Jeśli "prawdziwa" przypadkowość jest ważna, zalecam przeciw temu. Zobacz moją poniższą edycję.

Chciałem tylko dodać mój ulubiony sposób na trochę odmiany;)

Podając łańcuch:

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

Shuffle w jednym wierszu:

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

Wyjścia:

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 

EDYCJA: Jak zaznaczyła @PleaseStand, nie spełnia to w ogóle pytania OP, ponieważ cierpi na "kod Shuffle" przeglądarki Microsoft ". To nie jest bardzo dobry randomizer, jeśli twój ciąg musi być blisko losowy. Jest jednak niesamowicie szybkie "pomieszanie" twoich strun, gdzie "prawdziwa" przypadkowość jest nieistotna.

Artykuł, który zamieszczono poniżej, jest świetną lekturą, ale wyjaśnia zupełnie inny przypadek użycia, który wpływa na dane statystyczne. Osobiście nie mogę sobie wyobrazić praktycznego problemu z używaniem tej "losowej" funkcji w łańcuchu, ale jako programista, jesteś odpowiedzialny za to, aby wiedzieć, kiedy to użyć.

Zostawiłem to tutaj dla wszystkich przypadkowych randomizerów.

+0

-1: Ma to dokładny "błąd w teście losowym przeglądarki Microsoft". http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html – PleaseStand

+1

@PleaseStand Masz absolutną rację. Zawsze wiedziałem, że to dość leniwy hack, który w rzeczywistości nie przynosi bardzo przypadkowych wyników. Zaktualizuję moją odpowiedź, chociaż nie powiedziałbym, że to "dokładny błąd" - dotyczy to wyników ankiety. –

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

Wystarczy przekazać ciąg do funkcjonowania, aw zamian dostać tasuje ciąg

+1

dodaj przykład, jak przekazać. –

5

Mimo to zostało odebrane, chciałem podzielić rozwiązanie wymyśliłem:

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' 

Możesz również try it out (jsfiddle).

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

Odpowiedzi na siedmioletnie pytanie z niewyjaśnionym kodem? – traktor53

+0

Czy jest to po prostu inny sposób napisania [tej odpowiedzi] (https://stackoverflow.com/a/25419830/2350083)? – Jon

Powiązane problemy