js抽红包分配

将 50000元随机分给10我的,其中3我的必须分到百位数,4我的分到千位数,3我的分到万位数,每一个人所得金额javascript

 

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<meta http-equiv="X-UA-Compatible" content="ie=edge" />
	<title>Document</title>
</head>
<body>
	将 50000元随机分给10我的,其中3我的必须分到百位数,4我的分到千位数,3我的分到万位数,每一个人所得金额
</body>
<script type="text/javascript">
	
	/**
	 * 
	 * @param {Object} amount 总数钱
	 * @param {Object} list [2,2,2,3,3,3,3,4,4,4]  3个百位,4个千位,3个万位
	 */
	
	//不要小数
	function devide(amount,list){
		var len = list.length;
		
		//先计算全部的自身位数范围
		var arr = [];
		for(var i = 0; i < len; i++){
			var item = getRange(list[i]);
			
			arr.push(item);
		}
		
		var res = [];
		//只算n-1位,剩下最后一个,不用计算
		for(var i = 0; i < len-1; i++){
			var index = Math.floor(Math.random() * arr.length); //随机获取一个,而后用来取
			var item = arr.splice(index,1)[0]; //取出当前须要发的红包位数
			var result = calc(amount,item,arr);
			if(result){
				res.push(result);
				amount = amount - result;
			}else{
				return [];
			}
		}
		
		if(arr[0].start > amount || arr[0].end < amount){
			console.warn("分配出现错误,请从新规划分配方案");
			return [];
		}
		
		res.push(amount);
		return res;
	}
	
	function calc(amount,item,arr){		
		//当其余的都取最小值时的总和,为了保证每一个都分到
		var otherRange = getOtherRange(arr);
		var minStart = otherRange.countStart;
		var maxEnd = otherRange.countEnd;
		var mins = amount - minStart; //剩余可取
		var end = item.end;
		var start = item.start;
		if(start > mins){
			console.warn("分配出现错误,请从新规划分配方案");
			return false;
		}else if(end > mins){
			//若是最大范围大于剩余的
			end = mins;
		}
		
		//则随机抽取从 start至end
		
		var result = Math.floor(Math.random()*(end-start) + start);
		
		if(amount - result > maxEnd){
			//取的值过小,其余的取最大值也分不完
			console.warn("分配出现错误,请从新规划分配方案");
		}
		
		return result;
	}
	
	//获取某位的范围
	function getRange(item){
		return {
			start:Math.pow(10,item),     //好比百位2,这里最小就是100
			end: Math.pow(10,item+1) - 1 //百位最大为 1000-1
		}
	}
	
	//获取全部的范围
	function getOtherRange(arr){
		var countStart = 0;
		var countEnd = 0;
		for(var i = 0; i < arr.length; i++){
			countStart += arr[i].start;
			countEnd += arr[i].end;
		}
		return {
			countStart,
			countEnd
		};
	}
	
	console.log(devide(50000,[2,2,2,3,3,3,3,4,4,4]))
</script>
</html>
相关文章
相关标签/搜索