发红包案例分析以及普通红包和手气红包的实践

发红包案例分析

场景说明:红包发出去后所有人都有红包,大家都抢完后,最后一个红包给群主自己

红包分发的策略:

1、普通红包(平均):totalMoney/totalCount,余数放在最后一个红包当中

2、手气红包(随机):最少一分钱,最多不超过平均数的2倍,应该越发越少

复制代码
public interface OpenMode {
    /**
     * 将totalMoney分成totalCount份,保存到ArrayList<Integer>中,并将ArrayList<Integer>返回
     * @param totalMoney    总金额为方便计算,单位为分
     * @param totalCount    红包个数
     * @return ArrayList<Integer> 元素为各个红包的金额,所有元素的值的总和就是总金额
     */
    ArrayList<Integer> divide(int totalMoney,int totalCount);
}
复制代码
public class MyRed extends RedpackerFarme{
    public MyRed(String title){
        super(title);
    }
}
public class Bootstrap {
    public static void main(String[] args) {
        MyRed red = new MyRed("红包");
    }
}

 

 

 

普通红包平均分发

复制代码
public class Bootstrap {
    public static void main(String[] args) {
        MyRed red = new MyRed("红包");
        //设置群主名称
        red.setOwerName("张三");

        //普通红包
        OpenMode normal = new NormalMode();
        red.setOpenWay(normal);
    }
}
复制代码

在这里需要写一个OpenMode的实现类来计算平均分配的钱数

复制代码
public class NormalMode implements OpenMode{
    @Override
    public ArrayList<Integer> divide(final int totalMoney,final int totalCount) {
        ArrayList<Integer> list = new ArrayList<>();
        //平均值
        int avg = totalMoney/totalCount;
        //平分之后留下的零头
        int mod = totalMoney%totalCount;
        //注意totalCount - 1,代表最后一个先留着用来保存零头
        for (int i = 0; i < totalCount-1; i++) {
            list.add(avg);
        }
        //有零头需要保存在最后一个红包当中
        list.add(avg+mod);
        return list;
    }
}
复制代码

 

 

 

 

手气红包随机分发

随机分配,有可能多,有可能少

最少1分钱,最多不超过剩下金额平均数的2倍

假设要发10元的红包

第一次发红包,随机范围是0.01元—6.66元。

第一次发完后,剩下至少是3.34元。

此时还需要再发两个红包

此时的再发范围应该是0.01元—3.34元

 

因为是随机分发手气红包,要新建一个OpenMode的实现类来计算随机红包金额

复制代码
/**
 * 手气红包
 */
public class RandomMode implements OpenMode{
    /*
    随机分配,有可能多,有可能少
    最少1分钱,最多不超过剩下金额平均数的2倍
    假设要发10元的红包
    第一次发红包,随机范围是0.01元—6.66元。
    第一次发完后,剩下至少是3.34元。
    此时还需要再发两个红包
    此时的再发范围应该是0.01元—3.34元
     */
    @Override
    public ArrayList<Integer> divide(final int totalMoney,final int totalCount) {
        ArrayList<Integer> list = new ArrayList<>();
        //创建一个随机数生成器
        Random ra = new Random();
        //额外定义两个变量,分别代表剩下的钱,剩下多少份。
        int leftMoney = totalMoney;
        int leftCount = totalCount;
        //随机发前n-1个,最后一个不需要随机
        for (int i = 0; i < totalCount-1; i++) {
            int money = ra.nextInt(leftMoney / leftCount * 2);
            list.add(money);//将一个随机红包放入集合
            leftMoney-=money;//剩下的金额越发越少
            leftCount--;//还剩下未发的红包个数,递减
        }
        //最后一个红包不需要随机,直接放进去就行
        list.add(leftMoney);
        return list;
    }
}
复制代码
复制代码
public class Bootstrap {
    public static void main(String[] args) {
        MyRed red = new MyRed("红包");
        //设置群主名称
        red.setOwerName("张三");

        //普通红包
//        OpenMode normal = new NormalMode();
//        red.setOpenWay(normal);

        //手气红包
        RandomMode randomMode = new RandomMode();
        red.setOpenWay(randomMode);
    }
}
复制代码

 

posted @   xjw12345  阅读(312)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示