JS 实现 微信随机发红包思路

开年过来东莞,在回家路上在长沙Net社区群里看到有朋友提了一个发红包的问题,很多地方都有类型需求。整理了一下。开盒即用

总金额为100    最大金额10  最小金额2   要求随机生成15个数   这15个数的总和为100 

看到钱 来了兴趣了解了一下,大概需求是:100元 ,15个人分,金额大小在2~10之间。

整理思路:

1:随机数 范围有限制。

2: 随机15次 给10个分钱,这个时候可能分的钱大于100 或者小于100。

3:在减钱  或者加钱处理。

code如下:

 1     <script>
 2         /* 金额,最大金额,最小金额,人数 */
 3         let money = 100,
 4             maxRanDomNum = 15,
 5             mixRandomNum = 2,
 6             people = 15;
 7         /* 最终分到的钱 */
 8         let arrMonery = [];
 9 
10         /* 第一步:给15个人分钱 在最小,最大范围内,不管分多还是少 */
11         for (let index = 0; index < people; index++) {
12             const value = randomNum(mixRandomNum, maxRanDomNum);
13             arrMonery.push(value);
14         }
15 
16         /* 第2步: 分的钱多还是少 ,如果是0 ,刚好分到100元 */
17         let sumMoney = ArrTotal(arrMonery) - money;
18         /* 钱大于100 */
19         if (sumMoney > 0) {
20             for (let index = 0; index < sumMoney; index++) {
21                 const num = parseInt(Math.random() * people);
22                 //某一个人分到的钱小于mixRandomNum,停止减钱 但是sumMoney要加1
23                 if (arrMonery[num] == mixRandomNum) {
24                     sumMoney = sumMoney + 1;
25                     continue;
26                 }
27                 arrMonery[num]--;
28             }
29         }
30         /* 钱 小于100 */
31         else if (sumMoney < 0) {
32             for (let index = 0; index < sumMoney; index++) {
33                 const num = parseInt(Math.random() * people);
34                 //某一个人分到的钱是15元,停止加钱 但是sumMoney要加1
35                 if (arrMonery[num] == maxRanDomNum) {
36                     sumMoney = sumMoney + 1;
37                     continue;
38                 }
39                 arrMonery[num]++;
40             }
41         }
42         /* 打印钱的总和 */
43         console.log("打印钱的总和 " + ArrTotal(arrMonery));
44 
45         /* 打印所有分到的钱 */
46         console.log(arrMonery);
47 
48         /* 数组之和 */
49         function ArrTotal(arr) {
50             if (!arr instanceof Array) {
51                 console.error("参数错误,请传入数组");
52                 return;
53             }
54             if (arr.length == 0) {
55                 console.error("数组长度是0");
56                 return 0;
57             }
58             return eval(arr.join("+"));
59         }
60 
61         //生成从minNum到maxNum的随机数
62         function randomNum(minNum, maxNum) {
63             switch (arguments.length) {
64                 case 1:
65                     return parseInt(Math.random() * minNum + 1, 10);
66                     break;
67                 case 2:
68                     return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
69                     break;
70                 default:
71                     return 0;
72                     break;
73             }
74         }
75     </script>

开盒即用。

 

缺点:分到15元几率非常小

资料参考:

随机数:https://www.cnblogs.com/starof/p/4988516.html

 

需求2:10个人随机分100元

 

var arr  = new Array(10).fill(0)
for(var i=0;i<100;i++){
    var num = parseInt(Math.random()*10)
    arr[num] ++
}
console.log(arr)

 

posted @ 2020-02-20 15:20  s_p  阅读(808)  评论(0编辑  收藏  举报