@@ -15,121 +15,129 @@ public class RedPacket {
15
15
/**
16
16
* 生成红包最小值 1分
17
17
*/
18
- private static final int MIN_MONEY = 1 ;
18
+ private static final int MIN_MONEY = 1 ;
19
19
20
20
/**
21
21
* 生成红包最大值 200人民币
22
22
*/
23
- private static final int MAX_MONEY = 200 * 100 ;
23
+ private static final int MAX_MONEY = 200 * 100 ;
24
24
25
25
/**
26
26
* 小于最小值
27
27
*/
28
- private static final int LESS = -1 ;
28
+ private static final int LESS = -1 ;
29
29
/**
30
30
* 大于最大值
31
31
*/
32
- private static final int MORE = -2 ;
32
+ private static final int MORE = -2 ;
33
33
34
34
/**
35
35
* 正常值
36
36
*/
37
- private static final int OK = 1 ;
37
+ private static final int OK = 1 ;
38
38
39
39
/**
40
40
* 最大的红包是平均值的 TIMES 倍,防止某一次分配红包较大
41
41
*/
42
- private static final double TIMES = 2.1F ;
42
+ private static final double TIMES = 2.1F ;
43
43
44
- private int recursiveCount = 0 ;
44
+ private int recursiveCount = 0 ;
45
+
46
+ public List <Integer > splitRedPacket (int money , int count ) {
47
+ List <Integer > moneys = new LinkedList <>();
48
+
49
+ //金额检查,如果最大红包 * 个数 < 总金额;则需要调大最小红包 MAX_MONEY
50
+ if (MAX_MONEY * count <= money ) {
51
+ System .err .println ("请调大最小红包金额 MAX_MONEY=[" + MAX_MONEY + "]" );
52
+ return moneys ;
53
+ }
45
54
46
- private List <Integer > splitRedPacket (int money ,int count ){
47
- List <Integer > moneys = new LinkedList <>() ;
48
55
49
56
//计算出最大红包
50
- int max = (int ) ((money / count ) * TIMES ) ;
51
- max = max > MAX_MONEY ? MAX_MONEY : max ;
57
+ int max = (int ) ((money / count ) * TIMES );
58
+ max = max > MAX_MONEY ? MAX_MONEY : max ;
52
59
53
- for (int i = 0 ; i < count ; i ++){
60
+ for (int i = 0 ; i < count ; i ++) {
54
61
//随机获取红包
55
- int redPacket = randomRedPacket (money , MIN_MONEY ,max ,count - i ) ;
62
+ int redPacket = randomRedPacket (money , MIN_MONEY , max , count - i );
56
63
moneys .add (redPacket );
57
64
//总金额每次减少
58
- money -= redPacket ;
65
+ money -= redPacket ;
59
66
}
60
67
61
- return moneys ;
68
+ return moneys ;
62
69
}
63
70
64
71
private int randomRedPacket (int totalMoney , int minMoney , int maxMoney , int count ) {
65
72
//只有一个红包直接返回
66
- if (count == 1 ){
67
- return totalMoney ;
73
+ if (count == 1 ) {
74
+ return totalMoney ;
68
75
}
69
76
70
- if (minMoney == maxMoney ){
71
- return minMoney ;
77
+ if (minMoney == maxMoney ) {
78
+ return minMoney ;
72
79
}
73
80
74
81
//如果最大金额大于了剩余金额 则用剩余金额 因为这个 money 每分配一次都会减小
75
- maxMoney = maxMoney > totalMoney ? totalMoney : maxMoney ;
82
+ maxMoney = maxMoney > totalMoney ? totalMoney : maxMoney ;
76
83
77
84
//在 minMoney到maxMoney 生成一个随机红包
78
- int redPacket = (int ) (Math .random () * (maxMoney - minMoney ) + minMoney ) ;
85
+ int redPacket = (int ) (Math .random () * (maxMoney - minMoney ) + minMoney );
79
86
80
- int lastMoney = totalMoney - redPacket ;
87
+ int lastMoney = totalMoney - redPacket ;
81
88
82
- int status = checkMoney (lastMoney ,count - 1 ) ;
89
+ int status = checkMoney (lastMoney , count - 1 );
83
90
84
91
//正常金额
85
- if (OK == status ){
86
- return redPacket ;
92
+ if (OK == status ) {
93
+ return redPacket ;
87
94
}
88
95
89
96
//如果生成的金额不合法 则递归重新生成
90
- if (LESS == status ){
91
- recursiveCount ++ ;
97
+ if (LESS == status ) {
98
+ recursiveCount ++ ;
92
99
System .out .println ("recursiveCount==" + recursiveCount );
93
- return randomRedPacket (totalMoney ,minMoney ,redPacket ,count ) ;
100
+ return randomRedPacket (totalMoney , minMoney , redPacket , count );
94
101
}
95
102
96
- if (MORE == status ){
97
- recursiveCount ++ ;
103
+ if (MORE == status ) {
104
+ recursiveCount ++ ;
98
105
System .out .println ("recursiveCount===" + recursiveCount );
99
- return randomRedPacket (totalMoney ,redPacket ,maxMoney ,count ) ;
106
+ return randomRedPacket (totalMoney , redPacket , maxMoney , count );
100
107
}
101
108
102
- return redPacket ;
109
+ return redPacket ;
103
110
}
104
111
105
112
/**
106
113
* 校验剩余的金额的平均值是否在 最小值和最大值这个范围内
114
+ *
107
115
* @param lastMoney
108
116
* @param count
109
117
* @return
110
118
*/
111
119
private int checkMoney (int lastMoney , int count ) {
112
- double avg = lastMoney / count ;
113
- if (avg < MIN_MONEY ){
114
- return LESS ;
120
+ double avg = lastMoney / count ;
121
+ if (avg < MIN_MONEY ) {
122
+ return LESS ;
115
123
}
116
124
117
- if (avg > MAX_MONEY ){
118
- return MORE ;
125
+ if (avg > MAX_MONEY ) {
126
+ return MORE ;
119
127
}
120
128
121
- return OK ;
129
+ return OK ;
122
130
}
123
131
124
132
125
133
public static void main (String [] args ) {
126
- RedPacket redPacket = new RedPacket () ;
134
+ RedPacket redPacket = new RedPacket ();
127
135
List <Integer > redPackets = redPacket .splitRedPacket (20000 , 100 );
128
- System .out .println (redPackets ) ;
136
+ System .out .println (redPackets );
129
137
130
- int sum = 0 ;
138
+ int sum = 0 ;
131
139
for (Integer red : redPackets ) {
132
- sum += red ;
140
+ sum += red ;
133
141
}
134
142
System .out .println (sum );
135
143
}
0 commit comments