前些天遇到个问题,要实现从 [0,2000] 的数字中读取出100个不重复的随机数,该问题可以有多种实现方法,孤在此例举了一种时间复杂度仅为O[n],空间复杂度为O[n] 的例子,供大家参考:
<pre name="code" class="javascript">function getRandomArr() { //出题,从1000多道题中选出不重复的100道题~返回这个试题id 的数组~
var sub_arr = new Array();//生成的随机数数组
var has_arr = new Array();//稀疏数组,判断该数字是否已经选出
var temp = '';
for (var i = 1; i <=100; i++) {
do {
temp = getRandomNum(0, 2000);
} while (has_arr[temp] !== undefined)//判断该选出的数字是否已经选出
has_arr[temp] = 'has';//该数字作为偏移量,加入稀疏数组记录为已选
sub_arr[i] = temp;
}
return sub_arr.sort(function (a, b) {
return a - b;
});//升序排列
}
function getRandomNum(min, max) {//生成一个随机数从[min,max]
return min + Math.round(Math.random() * (max - min));
}
另,也有其他不同的实现方式,比如,选出一个随机数,遍历已选的随机数数组,如果已存在则重新选择随机数,这种方式时间复杂度较高约为O[n*n]空间复杂度O[1],具体大家可以自己尝试实现下~