zoukankan      html  css  js  c++  java
  • 随机抽取不重复的数组元素

    测试代码:

    var arr0 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var ranNum0 = 5;

    console.log(getDiffArr(arr0, ranNum0));
     
    方法实现:
    1.  不断缩减原数组,一次抽一个
            function getDiffArr(arr, num) {
                var arrOut = [];
                for (var i = 0; i < num; i++) {
                    var ran = Math.floor(Math.random() * arr.length);
                    arrOut.push(arr[ran]);
                    arr = (function (arr, ran) {
                        var arrOut = [];
                        for (var m = 0, n = arr.length; m < n; m++) {
                            if (arr[m] != arr[ran]) {
                                arrOut.push(arr[m]);
                            }
                        }
                        return arrOut;
                    }(arr, ran));
                }
                return arrOut;
            }

    2.从抽第二个起,新数组元素遍历比较当前随机元素,若抽到相同的则重抽

            function getDiffArr(arr, num) {
                var arrOut = [];
                var ran;
                for (var i = 0; i < num; i++) {
                    ran = Math.floor(Math.random() * arr.length);
                    // arrOut.push(arr[ran]);  // error
                    arrOut[i]=arr[ran];
                    if (i > 0) {
                        for (var m = 0; m < i; m++) {
                            if (arrOut[m] == arr[ran]) {
                                i--;
                                break;
                            }
                        }
                    }
    
                }
                return arrOut;
            }

    2.1  利用 flag 判定是否全不等

            var arr = [1, 2, 3, 4, 5, 6, 7, 8]
    
            function getDif(arr, num) {
                var arrOut = [];
                while (num > 0) {
                    var ran = Math.floor(Math.random() * arr.length);                
                    num--;
                    if (arrOut.length > 0) {
                        var flag=false;
                        for (var i = 0; i < arrOut.length; i++) {
                            if (arrOut[i] == arr[ran]) {
                                num++;
                                flag=true;
                                break;
                            }
                        }
                        if(!flag){
                            arrOut.push(arr[ran]);
                        }                    
                    }else{                    
                        arrOut.push(arr[ran]);
                    }
                }
    
                return arrOut;
            }
            console.log(getDif(arr, 5));
    View Code

    3.利用对象属性唯一性与数组形成绑定关系  

            function getDiffArr(arr,num) {
                var hash = {};
                var arrOut = [];
                while (num > 0) {
                    var ran = Math.floor(Math.random() * arr.length);
                    if (!hash[ran]) {
                        hash[ran] = 1;
                        arrOut.push(ran);
                        num--;
                    };
                }
                return arrOut;
            }

     3.1 不同的循环方式  

            var arr = [1, 2, 3, 4, 5, 6, 7, 8]
    
            function getDif(arr, num) {
                var arrOut = [];
                var hash = {};
                var len = arr.length;
    
                while(num){
                    var ran = Math.floor(Math.random() *  len);
                    if(!hash[ran]){
                        arrOut.push(arr[ran]);
                        hash[ran] = 1;   
                        num--;
                    }
                }
    
                // for (var i = 0; i < num; i++) {
                //     var ran = Math.floor(Math.random() *  len);
                //     if (!hash[ran]) {
                //         arrOut.push(arr[ran]);
                //         hash[ran] = 1;                 
                //     }else{
                //         num++;
                //     }
                // }
    
                return arrOut;
            }
            console.log(getDif(arr, 5));

     4. 不断缩减数组长度,减少比较次数和排除抽取重复元素的可能

            var arr = [1, 2, 3, 4, 5, 6, 7, 8]
    
            function getDif(arr, num) {
                var arrOut = [];            
                for (var i = 0; i < num; i++) {
                    var len=arr.length;
                    var ran = Math.floor(Math.random() * len);
                    arrOut[i] = arr[ran];
                    arr[ran]=arr[len-1];
                    arr.pop();   // arr=arr.slice(0,arr.length-1);
    
                }
    
                return arrOut;
            }
            console.log(getDif(arr, 5));

    4.1 优化算法:规避数组长度操作

            var arr = [1, 2, 3, 4, 5, 6, 7, 8];
            function getDif(arr, num) {
                var arrOut = [];   
                var len=arr.length;         
                for (var i = 0; i < num; i++) {                
                    var ran = Math.floor(Math.random() * (len-i));
                    arrOut[i] = arr[ran];
                    arr[ran]=arr[len-i-1];
                }
                return arrOut;
            }
            console.log(getDif(arr, 5));

     4.2 抽一个删一个

            var arr = [1, 2, 3, 4, 5, 6, 7, 8];
    
            function getDif(arr, num) {
                var arrOut = [];
                for (var i = 0; i < num; i++) {
                    var len = arr.length;
                    var ran = Math.floor(Math.random() * len);
                    arrOut[i] =  arr.splice(ran, 1)[0];
                   
                }
                return arrOut;
            }
            console.log(getDif(arr, 5));
  • 相关阅读:
    vue+mongoose+node.js项目总结第三篇_实现评论和回复功能
    vue+mongoose+node.js项目总结第二篇_模拟动态发布功能
    vue+mongoose+node.js项目总结第一篇_图片文件上传
    项目(踩坑)_vue中使用input file类型的时候获取不到当前的inputFile对象
    项目(踩坑)_node 中使用session中间件报undefined的问题
    netstat
    ifconfig
    mount/umount命令
    df du sync
    ln
  • 原文地址:https://www.cnblogs.com/justSmile2/p/10197327.html
Copyright © 2011-2022 走看看