nextint方法_利用java发红包(1)之红包分配方法

9ca1c1d92ac91b3f84f8660e77cb3eae.png

红包发放:

涉及继承:

一共三个类:

user mannger member

其中后两个类继承user类

其中mannger需要的方法是send(发红包)

发红包有两种常见的方法借用Arraylist:1,平均法 2,手气

1.平均法,只需要将所需发放的红包分成等份就可以了

private void average(ArrayList<Integer> 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<Integer> 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<Integer> list){
        Random r = new Random();
        int num = r.nextInt(list.size());
        int remove = list.remove(num);
        super.setRemainder(remove);
    }

最后我设置了五个群成员来抢红包,下面是运行结果图

72a0f19f158ea0dc9e700f96d98ff850.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值