在一定范围内,随机生成N个不等的数组

没有什么可说的,直接上代码吧。


写的很直接。

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个不同的数字

不得不佩服,有些方法,都太让人惊叹了。。。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值