278 字
1 分钟
将一个数组乱序
①sort + Math.random
WARNING 实际上这只是粗略的进行乱序,并不是真正意义上的”打乱”,具体原因和
sort
底层是如何实现的有关
let arr = [1,2,3,4,5,6]
arr.sort(() => {
return Math.random() - 0.5
})
②洗牌算法Fisher–Yates_shuffle
:::tip 原理
1、写下从 1 到 N 的数字
2、取一个从 1 到剩下的数字(包括这个数字)的随机数 k 3、从低位开始,得到第 k 个数字(这个数字还没有被取出),把它写在独立的一个列表的最后一位 4、重复第 2 步,直到所有的数字都被取出 5、第 3 步写出的这个序列,现在就是原始数字的随机排列
简单的说:就是随机抽一个放到最后。把剩余的数继续抽,继续放到次后… …依次执行
:::
function shuffle(array) {
var j, x, i;
for (i = array.length; i; i--) {
j = Math.floor(Math.random() * i);
/*
x = array[i - 1];
array[i - 1] = array[j];
array[j] = x;
*/
[array[i-1],array[j]] = [array[j],array[i-1]]
}
return array;
}
③借助loadash
中的shuffle
方法
const _ = require("lodash");
let array = [2, 4, 6, 9, 10];
let shuffled_array = _.shuffle(array);
console.log(shuffled_array);