หากมีอาร์เรย์เช่นนี้:
var arr1 = ["a", "b", "c", "d"];
วิธีการสุ่มขัดขวางลำดับของอาร์เรย์นั่นคือสลับมัน
มีอัลกอริทึมแบบสุ่มง่าย ๆ ที่แพร่กระจายอย่างกว้างขวาง:
ฟังก์ชั่น randomsort (a, b) {return (0.5 - math.random ()); -ที่จริงแล้วมันพิสูจน์แล้วว่าข้างต้นไม่ได้สุ่มอย่างสมบูรณ์
ฉันเพิ่งค้นหาสิ่งต่าง ๆ บนอินเทอร์เน็ตมากเกินไป มาดูคำตอบที่ให้คะแนนสูงเกี่ยวกับ Stackoverflow คำตอบมาจาก GitHub
knuth-shuffle
Fisher-Yates (aka knuth) สับเปลี่ยนสำหรับเบราว์เซอร์และ node.js
มาดูอัลกอริทึมที่กล่าวถึงข้างต้น รหัสมีดังนี้:
/ *jshint -w054 */(ฟังก์ชั่น (การส่งออก) {'ใช้อย่างเข้มงวด'; // http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-arrayfunction Shuffle ... ในขณะที่ (0! == CurrentIndex) {// เลือกองค์ประกอบที่เหลือ ... randomIndex = math.floor (math.random () * currentIndex); currentIndex -= 1; // และสลับกับองค์ประกอบปัจจุบัน temporaryValue = array [currentIndex]; array;} exports.knuthshuffle = shuffle;} ('undefined'! == typeof exports && exports || 'undefined'! == typeof window && window || global));ผู้เขียนแนะนำให้ใช้วิธีการเขียนเบราว์เซอร์:
(function () {'ใช้อย่างเข้มงวด'; var a = [2,11,37,42], b; // การสับเปลี่ยนปรับเปลี่ยนอาร์เรย์ดั้งเดิม // การเรียก A.slice (0) สร้างสำเนาซึ่งกำหนดให้ bb = window.knuthshufflenodejs:
npm ติดตั้ง -s knuth-shuffle (function () {'ใช้อย่างเข้มงวด'; var shuffle = ต้องการ ('knuth-shuffle'). knuthshuffle, a = [2,11,37,42], b; // shuffle ปรับเปลี่ยนอาร์เรย์ดั้งเดิม // shuffle (a.slice (0)); console.log (b);} ());มีคนอื่น ๆ ที่ผิดรูปจากอัลกอริทึมนี้เช่นต่อไปนี้สำหรับลูป ฉันจะไม่พูดถึงสิ่งอื่นใด
/*** การสุ่มองค์ประกอบอาร์เรย์ลำดับในสถานที่* การใช้อัลกอริทึมการสับเปลี่ยน durstenfeld*/ฟังก์ชั่น shufflearray (อาร์เรย์) {สำหรับ (var i = array.length-1; i> 0; i--) {var j = math.floor (math.random () (i + 1); = temp;} return array;}ใช้ ES2015 (ES6)
array.prototype.shuffle = function () {ให้ m = this.length, i; ในขณะที่ (m) {i = (math.random () * m--) >>> 0;ใช้:
[1, 2, 3, 4, 5, 6, 7] .Shuffle ();
ฉันพบอัลกอริทึมแบบสุ่มจำนวนมากสำหรับการค้นหาจีน แต่ไม่ว่าจะเป็นแบบสุ่มอย่างสมบูรณ์หรือไม่และยังคงมีประสิทธิภาพและความเข้ากันได้ ขอแนะนำว่าหากคุณต้องการใช้องค์ประกอบอาร์เรย์ที่ไม่ส่งแบบสุ่มในภายหลังคุณสามารถใช้องค์ประกอบข้างต้นได้