实现从区间产生不重复的随机数 - JS 实现

前些天遇到个问题,要实现从 [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],具体大家可以自己尝试实现下~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值