javascript 发红包算法
需求:今年各大IT界的巨头都添加了发红包的需求,所以咱们公司也不能落后。
系统中对于红包发放有两种方式:
1.固定红包即没人每次得到的红包都是定额的。
从程序员的角度来说:就是给每个人已经固定了红包的金额。
2.拼手气红包即有一个红包池,然后让池外的用户随机抽取红包(不过在程序上来说还是定额的哦!)
程序具体算法:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 5 <script> 6 var MAX = 200; //微信红包限制,最大金额 7 var MIN = 1; //微信红包的限制,最小金额 8 var totalNum = 1000; //红包总数量 9 var totalMoney = 1500; //红包总金额 10 var maxNumRate = 0.02; //大额红包获得者占总数的百分比 11 var maxMoneyRate = 0.99; //大额红包占总金额的比例 12 13 function cal(){ 14 var t = totalMoney - totalNum * MIN; 15 var tMax = t * maxMoneyRate; 16 if(tMax > (MAX - MIN) * totalNum * maxNumRate){ 17 tMax = (MAX - MIN) * totalNum * maxNumRate; 18 } 19 var tMin = totalMoney - tMax; 20 21 if (Math.random() < maxNumRate){ 22 //大红包 23 if(tMax == (MAX - MIN) * totalNum * maxNumRate){ 24 return [MAX, 1]; 25 } 26 var f = (MAX - MIN - tMax / totalNum); 27 if(f > (tMax / totalNum - MIN)){ 28 f = (tMax / totalNum - MIN) / 2; 29 } 30 if(f > 10){ 31 f = 10; 32 } 33 var rnd = Math.random() - 0.5; //-0.5 ~ 0.5 34 var r = tMax / (totalNum * maxNumRate) + rnd * f + MIN; 35 r = r > totalMoney ? totalMoney : r; 36 return [r, 1]; 37 }else{ 38 //小红包 39 var n = totalNum * (1 - maxNumRate); 40 var avg = tMin / n; 41 var rnd = (Math.random() - 0.5) / 10; //-0.05~0.05 42 var r = MIN + avg * rnd; 43 return [r > MIN ? r : MIN, 0]; 44 } 45 46 } 47 </script> 48 </head> 49 <body> 50 <ol> 51 <script> 52 var m = 0; 53 var t = 1000; 54 for(var i=0; i<t; i++){ 55 var m1 = cal(); 56 m += m1[0]; 57 document.write("<li style='color:" + (m1[1] == 1 ? "red" : "black") + "'>" + m1[0] + "</li>"); 58 } 59 document.write("<li>Total:" + t + "; cost: " + m + "</li>"); 60 </script> 61 </ol> 62 63 </body> 64 </html>
每个做IT的人心中都会有一个乔布斯,希望将自己发挥淋漓尽致,坚守自己初衷是对自己最好的回报。