红包发放:
涉及继承:
一共三个类:
user mannger member
其中后两个类继承user类
其中mannger需要的方法是send(发红包)
发红包有两种常见的方法借用Arraylist:1,平均法 2,手气
1.平均法,只需要将所需发放的红包分成等份就可以了
private void average(ArrayList list, int totalMoney, int num) {
this.checkMoney(super.getRemainder() - totalMoney);
//分成num等分 int avr = totalMoney / num;
//有余则放在最后一个红包中 int mod = totalMoney % num;
for (int i = 0; i < num - 1; i++) {
list.add(avr);
}
list.add(avr + mod);
}
2.手气法
我们需要首先设定一个最低红包数:2分,(分是发放的单位)我的方法是:我们首先需要有我们的基本盘,将2分分配下去,如果这个时候有剩余,存在一个变量count中。
我们则继续分配,但是在分配中,我们每一次循环得到的随机数money1,那么他的范围应该是递减的,不然有可能分配到最后,分出去的红包大于我们发放的钱数。所以我们应该让范围count -= money1;
当count还有剩余时,我们随机抽取一个红包,将count放入
private void luck(ArrayList list, int totalMoney, int num) {
int flag = 0;
int avr = totalMoney / num;
this.checkMoney(avr);
//保住最低保证
int count = totalMoney - 2 * num;
this.average(list, 2 * num, num);
Random r = new Random();
while (count > 0 && flag < num) {
int money1 = r.nextInt(count);
count -= money1;
list.set(flag, list.get(flag) + money1);
flag ++;
}
if(count > 0){
int randomNum = r.nextInt(num);
int money2 = list.get(randomNum);
money2 += count;
list.set(randomNum,money2);
}
}
而我们的member只需要做一件事取list中的一个红包并把它拆开,即receive方法
public void receive(ArrayList list){
Random r = new Random();
int num = r.nextInt(list.size());
int remove = list.remove(num);
super.setRemainder(remove);
}
最后我设置了五个群成员来抢红包,下面是运行结果图