随机生成数组,并且去重复项

时间:2022-09-03 17:26:50

1:先随机生成一组数字,并插入数组中:

function randomArray(len, min, max) {
if( len > (max - min +1) ){throw new Error('len > (max - min +1)')} //检查所设定数组是否超出预定总数,如果是则抛出异常
var result = [], e;
for( var i = 0; i < len; i++){
e = Math.floor(Math.random()*( max - min +1) + min);
result.push(e);
}
return result;
}
console.dir( randomArray(6, 2, 7) );

 

2:数组生成了,但我不希望数组里面出现重复的数字,所以就得实现数组去重复项:

function check(result, e){
for( i = 0; i < result.length; i++){
if( result[i] == e){ //遍历数组,查看数组里面的数字是否与正在生成的e相同,如果是,则返回true;
return true;
}
}
return false;

}

 

3:已经有检查数组中是否有重复项的方法了,因为要检查e是否已经在数组中,所以要把check函数在result.puse(e)前调用,所以完整代码如下:

function randomArray(len, min, max) {
if( len > (max - min +1) ){throw new Error('len > (max - min +1)')} //检查所设定数组是否超出预定总数,如果是则抛出异常
var result = [], e;
for( var i = 0; i < len; i++){
do{
e = Math.floor(Math.random()*( max - min +1) + min);
} while( check(result, e) );

result.push(e);
}
return result;
}

function check(result, e){
for( i = 0; i < result.length; i++){
if( result[i] == e){ //遍历数组,查看数组里面的数字是否与正在生成的e相同,如果是,则返回true;
return true;
}
}
return false;

}

console.dir( randomArray(6, 2, 7) );

 

 效率更高的一种方法是:新建一个对象flags,把生成e的数字记录为true保存到flags里面。通过判断flags[e]是不是true就知道数字是否生成过了:

    function randomArray(len, min, max){
if ( len > (max - min + 1) ) { throw new Error('len > (max - min + 1)') } //检查所设定数组是否超出预定总数,如果是则抛出异常
var result = [], flags = {}, e;
for( var i = 0; i < len; i++){
do{
e = Math.floor(Math.random() * (max - min + 1) + min);
} while( flags[e]); //当返回true是,执行do方法
flags[e] = true; //把e记录为true保存下来
result.push(e);
}
return result;
}
console.dir( randomArray(6, 2, 7) );