Jika ada array seperti ini:
var arr1 = ["a", "b", "c", "d"];
Bagaimana cara mengganggu urutan array secara acak, yaitu, mengocoknya.
Ada algoritma acak sederhana yang tersebar luas:
fungsi randomsort (a, b) {return (0,5 - math.random ()); }Sebenarnya, terbukti bahwa di atas tidak sepenuhnya acak.
Saya hanya mencari terlalu banyak hal seperti itu di internet. Mari kita lihat jawaban dengan skor tinggi di Stackoverflow. Jawabannya berasal dari GitHub.
Knuth-Shuffle
Fisher-yates (alias Knuth) mengocok untuk browser dan node.js
Mari kita lihat algoritma yang disebutkan di atas. Kodenya adalah sebagai berikut:
/*jshint -W054 */(function (exports) {'use strict';// http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-arrayfunction shuffle(array) {var currentIndex = array.length, temporaryValue, randomIndex;// While there remains elements to shuffle...while (0 ! == CurrentIndex) {// Pilih elemen yang tersisa ... randomIndex = Math.floor (Math.random () * CurrentIndex); CurrentIndex -= 1; // Swap dengan elemen saat ini. = shuffle;} ('tidak terdefinisi'! == typeof ekspor && ekspor || 'tidak terdefinisi'! == typeof window && window || global));Penulis merekomendasikan untuk menggunakan metode penulisan browser:
(function () {'Gunakan ketat'; var a = [2,11,37,42], b; // shuffle memodifikasi array asli // memanggil a.slice (0) membuat salinan, yang ditetapkan ke bb = window.knuthshuffle (a.slice (0)); console.log (b);} ();NodeJs:
instalasi npm -s knuth-shuffle (function () {'gunakan ketat'; var shuffle = membutuhkan ('knuth-shuffle'). Knuthshuffle, a = [2,11,37,42], b; // shuffle memodifikasi array asli // panggilan a.slice (0) membuat salinan, yang ditetapkan ke BB = = shuffle (a.slice (0)); console.log (b);} ());Ada yang lain yang cacat dari algoritma ini, seperti yang berikut untuk loop. Saya tidak akan membicarakan hal lain.
/*** Mengacak urutan elemen array di tempat.* Menggunakan algoritma shuffle durstenfeld.*/Function shufflearray (array) {for (var i = array.length-1; i> 0; i--) {var j = math.floor (math.random ()* (i + 1); var j = math.floor (math.random ()* (i + 1); = temp;} return array;}Menggunakan ES2015 (ES6)
Array.prototype.shuffle = function () {let m = this.length, i; while (m) {i = (math.random () * m--) >>> 0; [ini [m], ini [i]] = [ini [i], ini [m]]} kembalikan ini;}menggunakan:
[1, 2, 3, 4, 5, 6, 7] .shuffle ();
Saya menemukan banyak algoritma acak untuk pencarian Cina, tetapi apakah itu benar -benar acak masih diperlukan, dan efisiensi dan kompatibilitas masih harus diselidiki. Dianjurkan bahwa jika Anda perlu menggunakan elemen array yang mengganggu secara acak nanti, Anda dapat menggunakan yang di atas.