前言
在平常的开发工作中,我们经常会遇到排序的问题。比如按时间升/降序等诸如此类的排序,有兴趣的同学可以翻看我之前的文章 JS 中常见的排序算法 。
今天我们来说的是 随机排序
,即把已有的顺序进行随机打乱从而形成新的乱序规则。一般常用的有四种:Sort
、迭代
、递归
和 经典的洗牌算法
,接下来我们详细的看下具体怎么实现的。
Sort
这种方法随机排序的概率不是平均的,即有时候不够随机。
主要利用 Math.random
产生随机小数并减去 0.5
来随机生成 正/负
.
function foo(arr){
let clonrArr = arr.concat();
clonrArr = clonrArr.sort(function(){
return Math.random() - .5;
})
return clonrArr;
}
迭代
主要利用 Math.floor( Math.random() * clonrArr.length )
找到随机索引位置
function foo(arr){
let clonrArr = arr.concat(),
len = clonrArr.length,
index = null,
result = [];
for(let i= 0; i < len; i++){
//得到随机的数组索引
index = Math.floor( Math.random() * clonrArr.length );
// result.push(clonrArr.splice(index,1)[0]);
result = result.concat(clonrArr.splice(index,1));
}
// 返回结果
return result;
}
递归
主要利用 Math.floor( Math.random() * clonrArr.length )
找到随机索引位置
function foo(arr){
let clonrArr = arr.concat(),
result = [],
index = null;
function fn(){
// 递归结束条件
if(!clonrArr.length) return;
//得到随机的数组索引
index = Math.floor( Math.random() * clonrArr.length );
// result.push(clonrArr.splice(index,1)[0]);
result = result.concat(clonrArr.splice(index,1));
// 递归调用
fn();
}
// 调用函数
fn();
// 返回结果
return result;
}
洗牌算法
在迭代的基础上,交换了随机的位置,效率上是这几种算法中最快的一个
function foo(arr){
let clonrArr = arr.concat(),
len = clonrArr.length,
index = null;
for(let i= 0; i < len; i++){
index = Math.floor( Math.random() * clonrArr.length );
[clonrArr[index], clonrArr[i]] = [clonrArr[i], clonrArr[index]];
}
// 返回结果
return clonrArr;
}
网友评论