网络编程
位置:首页>> 网络编程>> JavaScript>> 基于js实现抽红包并分配代码实例

基于js实现抽红包并分配代码实例

作者:muamaker  发布时间:2024-04-16 09:30:58 

标签:js,红包,分配

这篇文章主要介绍了基于js实现抽红包并分配代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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


<!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>

来源:https://www.cnblogs.com/muamaker/p/9325204.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com