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

本文介绍两种从源数组中随机选择不重复元素的方法,并通过实例演示了如何使用JavaScript实现方案二,该方法通过选取元素下标来提高存储效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

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

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

解决方案

方案一:

  1. 根据数组source,在0到source.length-1范围内随机一个数作为下标,选择下标对应元素放入数组target
  2. 同1法,再从source数组随机一个数,将这个数与target数组中已有的数进行比较,不同则放入,相同则再随机
  3. 重复执行2,然后就能筛选出n个不同的数。

方案二:

  1. 根据数组source,在0到source.length-1范围内随机一个数作为下标,选择下标放入数组target
  2. 同1法,随机一个新的下标,将这个数与target数组中已有的数进行比较,不同则放入,相同则再随机
  3. 重复执行2,然后就能筛选出n个不同的数。
  4. 这个时候数组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]]);
        //}
    })(); 

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

我也是优化了半天才想出的方法,很是(∩_∩),简单的问题不断从优解决,我们会更加进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值