没有什么可说的,直接上代码吧。
写的很直接。
function getDifNum(num,minNum,maxNum){
//在一定minNum - maxNum 的范围内,获取num个不相同的数
//num为返回数组的个数,minNum和maxNum为取值的最小值和最大值。
var res = [],
i=0,
len,
flag=false,
btn;
if(typeof maxNum != "number"){
//如果输入的第三个参数不是一个数字
//则把取值范围改变为0-minNum。
maxNum = minNum;
minNum = 0;
}
if(typeof maxNum != "number" || maxNum <= minNum){
//如果这个时候,maxNum不为数字,并且最大值小于最小值的话,结束。
return;
}
btn = maxNum - minNum;
//记录最大值和最小值之间的个数
if(num >= btn){
//如果要求输出数组大小,大于最大值和最小值的情况,结束。
return;
}else if(num > Math.ceil(btn/2)){
//尽量小的求随机数,并添加标志位,方便最后进行处理。
num = btn - num;
flag = true;
}
res = getRandArr(num,minNum,maxNum);
//获取一个随机数数组。
function getArr(num,min,max){
//获取一个最小值为min,数组大小为num的顺序数组。
var arr = [],
i=0;
for(i=min;i<max;i++){
arr[i-min] = i;
}
return arr;
}
function getRandArr(num,min,max){
//获取一个最小值为min,最大值为max,长度为num的随机数组
var arr = [];
for(var i = 0;i<num;i++){
arr[i] = getRandNum(min,max);
}
return arr;
}
function getRandNum(min,max){
//在max和min之间,获取一个随机数
return Math.round(Math.random()*(max-min) + min)
}
function deleSame(arr){
//数组去重
var i=0;
arr.sort();
for(;i<arr.length;i++){
if(arr[i] == arr[i+1]){
arr.splice(i,1);
i--;
}
}
return arr;
}
function getOther(btn,arr,min,max){
//获取不包含arr数组的数组。
var i=0,
len = arr.length;
var arr2 = getArr(btn,min,max),
btn = btn - arr.length;
for(i=0;i<len;i++){
arr2[arr[i]-min] = -1;
}
for(i=arr2.length-1;i>=0;i--){
if(arr2[i] == -1){
arr2.splice(i,1);
}
}
if(arr2.length > btn){
arr2 = arr2.slice(0,btn);
}
return arr2;
}
function checkInArr(num,arr){
//判断数字num是否存在于数组arr中
for(var i=0,len=arr.length;i<len;i++){
if(arr[i] == num){
return true;
}
}
return false;
}
res = deleSame(res);
//对随机生成的数组res去重。
while(res.length < num){
//如果去重之后的数组,长度小,则单个添加。
var ran = getRandNum(minNum,maxNum);
if(!checkInArr(ran,res)){
res.push(ran);
};
}
if(res.length > num){
//如果数组长度大于要求的数组,则把最后几个去掉。
res = res.slice(0,num);
}
res = res.sort(function(a,b){return a -b;});
//按数组数值大小,进行排序
//根据两种情况,分别处理返回值。
if(!flag){
return res;
}else{
return getOther(btn,res,minNum,maxNum);
}
}
console.log(getDifNum(30,10,52));
使用方法,也很简单,直接输入参量就行。
getDifNum(a1,a2,a3);
第一个参数 a1 必须数字,没有做格式错误的判断,要注意。
如果有三个参数,数组的取值的范围是 a2 -- a3,
如果只有两个参数,则取值范围是 0 - a2;
注:如果你能看到这里,说明你是真的想要了解这个方法吧,这里添加一个牛人写的更好的方法:
function getDifNum(num,min,max){
var res = [];
for(var i =min;i<=max;i++){
res.push(i);
}
res.sort(function(){return 0.5 - Math.random();});
res.length = num;
return res;
}
console.log(getDifNum(30,10,55).sort());
想要观摩是哪位牛人的思路,可以查看这个帖子哦: js随机生成0-51之间30个不同的数字
不得不佩服,有些方法,都太让人惊叹了。。。