Si hay una matriz como esta:
var arr1 = ["a", "b", "c", "d"];
Cómo interrumpir aleatoriamente el orden de la matriz, es decir, barajarla.
Hay un algoritmo aleatorio simple que está ampliamente extendido:
función randomsort (a, b) {return (0.5 - math.random ()); }En realidad, se demuestra que lo anterior no es completamente aleatorio.
Acabo de buscar muchas cosas de este tipo en Internet. Echemos un vistazo a una respuesta de alta puntuación en Stackoverflow. La respuesta proviene de Github.
knuth-shuffle
El Fisher-Yates (también conocido como Knuth) se baraja para el navegador y el nodo.js
Echemos un vistazo al algoritmo mencionado anteriormente. El código es el siguiente:
/ *jshint -w054 */(function (exports) {'use strict'; // http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javaScript-arrayFunction shuffle (array) {var centreindex = array.length, temporalValue, randomindex;////////////s shitt to shuffle ... a shuffle ... ! == CurrentIndex) {// elige un elemento restante ... RandomIndex = Math.Floor (Math.Random () * CurrentIndex); CurrentIndex -= 1; // e intercambiarlo con el elemento actual. = shuffle;} ('Undefined'! == TypeOf Exports && Exports || 'Undefined'! == TypeOf Window && Window || Global));El autor recomienda usar un método de escritura del navegador:
(function () {'use estrict'; var a = [2,11,37,42], b; // El shuffle modifica la matriz original // llamando a a.slice (0) crea una copia, que se asigna a bb = window.knuthshuffle (a.slice (0)); console.log (b);} ();NodeJS:
npm install -s knuth-shuffle (function () {'use strict'; var shuffle = request ('knuth-shuffle'). knuthshuffle, a = [2,11,37,42], b; // el shuffle modifica el original // llamando a a.slice (0) crea una copia, que se asigna a bb = shuffle (a.slice (0); consolo.LoG (ul);Hay otros que se deforman de este algoritmo, como el siguiente para bucle. No hablaré de nada más.
/*** Aleatorizar el orden del elemento de matriz en el lugar.* Usando algoritm de shuffle Durstenfeld.*/Function shufflearRay (array) {for (var i = array.length-1; i> 0; i--) {var j = math.floor (math.random ()* (i + 1)); var temp = array [i]; array [ary] Temp;} return Array;}Usando ES2015 (ES6)
Array.prototype.shuffle = function () {let m = this.length, i; while (m) {i = (math.random () * m--) >>> 0; [this [m], this [i]] = [this [i], this [m]]} Devuelve esto;}usar:
[1, 2, 3, 4, 5, 6, 7] .shuffle ();
Encontré muchos algoritmos aleatorios para la búsqueda china, pero aún es necesario que sea completamente aleatorio, y la eficiencia y la compatibilidad aún no se han investigado. Se recomienda que si necesita usar elementos de matriz de interrupción al azar más tarde, puede usar el anterior.