码迷,mamicode.com
首页 > 编程语言 > 详细

抢红包算法

时间:2018-03-12 21:14:27      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:func   else   number   col   整型   代码   span   let   pow   

notice:

  • 平均红包金额不能低于0.01元
  • 对浮点数四则运算和四舍五入的处理
  1 <script>
  2     //调用方法
  3     getRedPacket(10,9);
  4 
  5     /*
  6     * @description:抢红包算法
  7     * @params {Number} money 总金额
  8     * @params {Number} num 红包总个数
  9     * @return {Number}
 10     * */
 11     function getRedPacket(money,num) {
 12         let redPacketArr = [], //记录分配的红包金额
 13             remainMoney = money, //剩余的红包金额
 14             avgMoney = div(money,num); //平均分得的红包金额
 15         if(avgMoney < 0.01){
 16             alert(‘单个红包金额不低于0.01元‘);
 17             return;
 18         }else{
 23             let i = 1, //计算总数量-1个
 24                 randomIndex = 0, //最后一个数在redPacketArr的位置
 25                 last = 0; //计算最后一个数
 26             for(i; i < num; i++){
 27                 let randomMoney = Math.random()*rewriteToFixed(avgMoney,4), //随机值,保留4位小数
 28                     val = rewriteToFixed(randomMoney,2); //随机值保留2为小数
 29                 if(val != 0){
 30                     remainMoney = sub(remainMoney,val);
 31                     redPacketArr.push(val);
 32                 }else {
 33                     i--;
 34                 }
 35             }
 36             last = redPacketArr.reduce((x,y) => add(x,y));
 37             randomIndex = Math.floor(Math.random()*redPacketArr.length);
 38             redPacketArr.splice(randomIndex,0,rewriteToFixed(sub(money,last),2)); //把最大金额随机插入redPacketArr中
 39         }
 40         //console.log(redPacketArr);
 41         return redPacketArr;
 42     }
 43     /*
 44     * @description:重写toFixed方法
 45     * @params {Number} value,num
 46     * @return {Number}
 47     * */
 48     function rewriteToFixed(value,num) {
 49         let str = ‘‘ + value,
 50             index = str.indexOf(‘.‘), //小数点的位置
 51             sliIndex = index + num + 1,
 52             s1 = str.slice(0,sliIndex),
 53             nextNum = Number(str.slice(sliIndex,sliIndex + 1));
 54         if(nextNum > 5){
 55             s1 = s1.replace(/\d$/,v => Number(v)+1);
 56         }
 57         return Number(s1); //随机值保留2为小数
 58     }
 59     /*
 60     * @description:浮点数相加
 61     * @params {Number} n1,n2
 62     * @return {Number}
 63     * */
 64     function add(n1,n2) {
 65         let e = commonCode(n1,n2);
 66         return (n1*e + n2*e)/e;
 67     }
 68 
 69     /*
 70     * @description:浮点数相减
 71     * @params {Number} n1,n2
 72     * @return {Number}
 73     * */
 74     function sub(n1,n2) {
 75         let e = commonCode(n1,n2);
 76         return (n1*e - n2*e)/e;
 77     }
 78 
 79     /*
 80     * @description:浮点数相乘
 81     * @params {Number} n1,n2
 82     * @return {Number}
 83     * */
 84     function mul(n1,n2) {
 85         let e = commonCode(n1,n2);
 86         return (n1*e) * (n2*e) / Math.pow(e,2);
 87     }
 88 
 89     /*
 90     * @description:浮点数相除
 91     * @params {Number} n1,n2
 92     * @return {Number}
 93     * */
 94     function div(n1,n2) {
 95         let e = commonCode(n1,n2);
 96         return (n1*e) / (n2*e);
 97     }
 98 
 99     /*
100     * @description:公共代码
101     * @params {Number} n1,n2
102     * @return {Number} e 将n1和n2带小数带转成整型
103     * */
104     function commonCode(n1,n2) {
105         let len1 = 0,
106             len2 = 0,
107             str1 = (‘‘ + n1),
108             str2 = (‘‘ + n2);
109         if(/\./g.test(str1)){
110             len1 = str1.split(‘.‘)[1].length; //n1小数长度 //toString()或String()用于小数后不超过7位
111         }
112         if(/\./g.test(str2)){
113             len2 = str2.split(‘.‘)[1].length; //n2小数长度
114         }
115         return Math.pow(10,Math.max(len1,len2));
116     }
117 </script>

 

抢红包算法

标签:func   else   number   col   整型   代码   span   let   pow   

原文地址:https://www.cnblogs.com/belongto/p/8550872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!