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>
相關文章
相關標籤/搜索