您的位置:首页 > Web前端 > JavaScript

m个元素的数组,随机选择n个不重复元素(js实现)

2016-01-09 21:21 996 查看

问题描述:

在由m个元素的source数组中,随机选择n个不重复的元素放入新数组target


注:source数组元素本身不重复,m>n

解决方案

方案一:

根据数组source,在0到source.length-1范围内随机一个数作为下标,选择下标对应元素放入数组target

同1法,再从source数组随机一个数,将这个数与target数组中已有的数进行比较,不同则放入,相同则再随机

重复执行2,然后就能筛选出n个不同的数。

方案二:

根据数组source,在0到source.length-1范围内随机一个数作为下标,选择下标放入数组target

同1法,随机一个新的下标,将这个数与target数组中已有的数进行比较,不同则放入,相同则再随机

重复执行2,然后就能筛选出n个不同的数。

这个时候数组target都存放的是要选取的数的下标,我们根据下标转换成对应的source数组中的数即可

方案一和方案二的区别:

我们平时可能用方案一比较多,因为比较直观,但是分析表明,方案二是更好的。原因:方案一比较的是真实数据,方案二比较的是下标,所以方案二在比较存储时效率较高,且存储所占内存小。

方案二JavaScript代码

/**
*  source共10个元素
*  选择4个数据存储在target
*
*/
(function(){
var source= [
"c","c++","php","html","css","javascript","java","jsp","asp","node"
];
var sL = source.length;

var target= [];     //存储下标

//随机4个数组下标
for(var i = 0; i < 4; i++){
var rand = Math.floor( Math.random() * sL );
if(target.length > 0){
detection(target, rand);
}else{
target.push(rand);
}
}
//检测num是否存在于arr,存在重新添加,不存在直接添加
function detection(arr, num){
var repeatFlag = false;
for(var j = 0; j < arr.length; j++){
if(arr[j] == num){
repeatFlag = true;
}
}
if(repeatFlag){
//递归
arguments.callee(arr, Math.floor( Math.random() * sL ));
}else{
arr.push(num);
}
}

//测试,输出target
//for(var i=0; i<target.length; i++){
//  console.log(source[target[i]]);
//}
})();


注释的代码,为测试的代码。

我也是优化了半天才想出的方法,很是(∩_∩),简单的问题不断从优解决,我们会更加进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息