‘use strict‘; // 排序算法、 // 生成一个指定数量的不含重复数字的随机数组 function ranArr(n,callback) { var res = []; var tmp ; res = lack(res,n); ckRanArr(res,n,0,function (res) { return callback(res); }); } // 生成一个指定范围内(正整数 a到b)的随机数 function ranNum(a,b){ var n = Math.abs(a - b ); var base_n = a; if(a > b){ base_n = b; } var res = Math.floor(Math.random()*n) + base_n; return res; } // 返回去除重复项后的数组 function quchong(arr) { var arr2 = arr.slice(0); var arr2_len = arr2.length; var arr3 = []; for(var j = 0;j < arr2_len;j++){ // 重复项不进新数组 去重 (function (item,ind) { var flag = false; for(var k = (ind + 1);k < arr2_len; k++){ if(item == arr2[k]){ flag = true; } } if(!flag){ arr3.push(item); } }) (arr2[j],j); } return arr3; } // 补缺失的量并检查 function lack(arr,n) { // 去重后数量少了 补上 var arr_len = arr.length; if(arr_len < n){ var lack = n - arr_len; for(var j = 0; j < lack;j++){ arr.push( ranNum(0,100000000) ); } } return arr; } // 递归检查函数 count:重试次数 重试次数限制与生成数量相关 function ckRanArr(arr,n,count,callback){ var limit; if(n < 1000){ limit = 10*n; } if(n >= 1000){ limit = n; } if(count < limit){ count++; var arr2 = quchong(arr); // 去重 if(arr2.length < n ){ var arr3 = lack(arr2,n); // 补量 ckRanArr(arr3,n,count,callback); } else{ return callback(arr2); } } else{ return callback( quchong(arr) ); } } ranArr(10,function (res) { console.log(res); });
// 上面的递归调用会发生每个函数都是一个栈,会生成一个不断堆叠的函数栈直到最后一个栈函数return后依次退出。
// 同步循环生成版 function ranArr2(n){ var arr = []; arr = lack(arr,n); var limit; if(n < 1000){ limit = 10*n; } else{ limit = n; } cl:for(var i = 0;i < limit;i++){ console.log(i); var arr2 = quchong(arr); // 去重 if(arr2.length < n){ arr = lack(arr2,n); // 补量 } else{ break cl; } } return arr; }
原文:http://www.cnblogs.com/isdom/p/webclips072.html