0
点赞
收藏
分享

微信扫一扫

js抽红包分配

IT影子 2021-09-24 阅读 65

将 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>
举报

相关推荐

0 条评论