Shuffle mảng tại chỗ
function shuffleArr [array]{
for [var i = array.length - 1; i > 0; i--] {
var rand = Math.floor[Math.random[] * [i + 1]];
[array[i], array[rand]] = [array[rand], array[i]]
}
}
Es6 tinh khiết, lặp đi lặp lại
const getShuffledArr = arr => {
const newArr = arr.slice[]
for [let i = newArr.length - 1; i > 0; i--] {
const rand = Math.floor[Math.random[] * [i + 1]];
[newArr[i], newArr[rand]] = [newArr[rand], newArr[i]];
}
return newArr
};
Kiểm tra độ tin cậy và hiệu suất
Một số giải pháp trên trang này không đáng tin cậy [chúng chỉ ngẫu nhiên một phần cho mảng]. Các giải pháp khác ít hiệu quả hơn đáng kể. Với testShuffleArrayFun
[xem bên dưới], chúng tôi có thể kiểm tra các chức năng xáo trộn cho độ tin cậy và hiệu suất.
function testShuffleArrayFun[getShuffledArrayFun]{
const arr = [0,1,2,3,4,5,6,7,8,9]
var countArr = arr.map[el=>{
return arr.map[
el=> 0
]
}] // For each possible position in the shuffledArr and for
// each possible value, we'll create a counter.
const t0 = performance.now[]
const n = 1000000
for [var i=0 ; i{countArr[key][value]++}
]
}
const t1 = performance.now[]
console.log[`Count Values in position`]
console.table[countArr]
const frequencyArr = countArr.map[ positionArr => [
positionArr.map[
count => count/n
]
]]
console.log["Frequency of value in position"]
console.table[frequencyArr]
console.log[`total time: ${t1-t0}`]
}
Các giải pháp khác
Các giải pháp khác chỉ để giải trí.
ES6 thuần khiết, đệ quy
const getShuffledArr = arr => {
if [arr.length === 1] {return arr};
const rand = Math.floor[Math.random[] * arr.length];
return [arr[rand], ...getShuffledArr[arr.filter[[_, i] => i != rand]]];
};
ES6 thuần khiết sử dụng mảng.map
function getShuffledArr [arr]{
return [...arr].map[ [_, i, arrCopy] => {
var rand = i + [ Math.floor[ Math.random[] * [arrCopy.length - i] ] ];
[arrCopy[rand], arrCopy[i]] = [arrCopy[i], arrCopy[rand]]
return arrCopy[i]
}]
}
ES6 thuần túy bằng cách sử dụng mảng.Reduce
function getShuffledArr [arr]{
return arr.reduce[
[newArr, _, i] => {
var rand = i + [ Math.floor[ Math.random[] * [newArr.length - i] ] ];
[newArr[rand], newArr[i]] = [newArr[i], newArr[rand]]
return newArr
}, [...arr]
]
}
Trong bài viết này, chúng tôi sẽ xem xét một vài cách để xáo trộn một mảng trong JavaScript.
Tùy chỉnh sắp xếp
Cách đầu tiên và đơn giản nhất để xáo trộn một mảng trong JavaScript là cung cấp chức năng tùy chỉnh cho .sort[]
.
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const shuffledArray = array.sort[[a, b] => 0.5 - Math.random[]];
Nhập chế độ FullScreenen EXIT Mode FullScreen
Vì chức năng chúng tôi chuyển sang .sort[]
đang tìm kiếm một số dương hoặc âm để di chuyển vật phẩm 'lên' hoặc 'xuống' trong mảng .
Điều này hoạt động cho một cách tiếp cận thô sơ và sẵn sàng nhưng có thể không cung cấp cho bạn một sự xáo trộn thực sự ngẫu nhiên.
Nếu bạn thực hiện một chút nghiên cứu về kỹ thuật trên [hãy xem bài viết này], bạn sẽ thấy rằng sử dụng chức năng sắp xếp tùy chỉnh là thiếu sót [mặc dù tôi có thể đưa ra câu trả lời dứt khoát về lý do tại sao!].
Nếu bạn cần xáo trộn một mảng và có phân phối các mặt hàng thực sự ngẫu nhiên, bạn cần thực hiện thuật toán Fisher-Yates.
Thuật toán Fisher-Yates
May mắn cho chúng tôi, nó không quá phức tạp:
const shuffleArray = array => {
for [let i = array.length - 1; i > 0; i--] {
const j = Math.floor[Math.random[] * [i + 1]];
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Vì chức năng chúng tôi chuyển sang .sort[]
đang tìm kiếm một số dương hoặc âm để di chuyển vật phẩm 'lên' hoặc 'xuống' trong mảng .
Điều này hoạt động cho một cách tiếp cận thô sơ và sẵn sàng nhưng có thể không cung cấp cho bạn một sự xáo trộn thực sự ngẫu nhiên.