2010-10-15 12 views
30

En particular, quiero asegurarme de evitar el error cometido en el código aleatorio de selección de navegador de Microsoft. Es decir, quiero asegurarme de que cada letra tenga la misma probabilidad de terminar en cada posición posible.¿Cómo mezclo los caracteres en una cadena en JavaScript?

p. Ej. Dado "ABCDEFG", devuelve algo como "GEFBDCA".

Respuesta

54

he modificado un ejemplo de la Fisher-Yates Shuffle entry on Wikipedia a barajar cadenas:

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 " 

Más información se puede encontrar en Jon Skeet's answer a Is it correct to use JavaScript Array.sort() method for shuffling?.

+0

Gracias, esto es definitivamente más uniforme que algunos otros ejemplos que encontré. – Liam

32

Si la aleatoriedad "verdaderamente" es importante, recomiendo esto. Ver mi edición a continuación.

Yo sólo quería añadir mi método favorito para un poco de variedad;)

Dada una cadena:

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

aleatoria en una línea:

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

Salidas:

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 

EDITAR: Como @PleaseStand ha señalado, esto no cumple con la pregunta de OP en absoluto, ya que adolece del código "Microsoft Browser Choice Shuffle". Este no es un aleatorizador muy bueno si su cadena necesita ser casi aleatoria. Sin embargo, es asombroso al "mezclar" rápidamente tus cadenas, donde la aleatoriedad "verdadera" es irrelevante.

El artículo que vincula a continuación es una gran lectura, pero explica un caso de uso completamente diferente, que afecta a los datos estadísticos. Personalmente no puedo imaginar un problema práctico con el uso de esta función "aleatoria" en una cadena, pero como codificador, usted es responsable de saber cuándo no para usar esto.

Lo dejé aquí para todos los aleatorizadores casuales.

+0

-1: tiene el "error exacto cometido en el código aleatorio de selección de navegador de Microsoft". http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html – PleaseStand

+1

@PleaseStand Tiene toda la razón. Siempre he sabido que esto es un hack bastante flojo que en realidad no produce resultados muy aleatorios. Actualizaré mi respuesta, aunque no diría que es el "error exacto", eso fue para los resultados de la encuesta. –

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

sólo tiene que pasar la cadena a funcionar ya cambio obtener la cadena barajado

+1

agrega un ejemplo de cómo pasar. –

5

A pesar de que esto ha sido contestada, que quería compartir la solución que se me ocurrió:

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' 

También puede try it out (jsfiddle).

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

Respondiendo una pregunta de 7 años con un código inexplicado? – traktor53

+0

¿Es esta otra forma de escribir [esta respuesta] (https://stackoverflow.com/a/25419830/2350083)? – Jon

Cuestiones relacionadas