发红包案例分析以及普通红包和手气红包的实践
发红包案例分析以及普通红包
场景说明:
红包发出去之后,所有人都有红包,大家抢完之后,最后一个红包给群主自己。
大多数代码都是现成的,我们需要做的就是填空题。
我自己要做的事情有:
1.设置一下程序的标题,通过构造方法的字符串参数
2.设置群主名称
3.设置分发策略:平均,还是随机?
红包分发的策略:
1.普通红包(平均):totalMoney / totalCount,余数放在最后一个红包当中
2.手气红包(随机):最少1分钱,最多不超过平均数的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("红包"); } }
普通红包平均分成
创建一个类继承RedPacketFrame重写方法
public class MyRed extends RedPacketFrame { /** * 构造方法:生成红包界面。 * * @param title 界面的标题 */ public MyRed(String title) { super(title); } }
在测试类中设置标题,群主的名称 调用普通红包通过向上转型输出对象
public class Bootstrap { public static void main(String[] args) { MyRed red = new MyRed("大红包");//红包标题
red.setOwnerName("薛佳旺");//设置群主名称
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 次数减1保留最后一次 for (int i = 0; i <totalCount - 1 ; i++) { list.add(avg);//存入平均数 } //有零头,需要放在最后一个红包当中 list.add(avg + mod); return list; } }
手气红包随机分发
创建一个RandomMode 实现OpenMode并重写方法
public class RandomMode implements OpenMode { @Override public ArrayList<Integer> divide(final int totalMoney,final int totalCount) { ArrayList<Integer> list = new ArrayList<>(); //随机分配,有可能多,有可能少 //最小1分钱 最多不超过“剩下金额平均数的2倍” //第一次发红包,随机范围是0.01元~6.66元 //第一次发完之后,剩下的至少是3.34元 //此时还需要再发2个红包 //此时的再发范围应该是0.01元~3.34元(取不到右边,剩下0.01) //总结一下,范围是【公式】是:random.nextInt(leftMoney / leftCount * 2)+1; Random random = new Random();//生成随机数 //totalMoney是总金额,totalCount是总份数,剩下多少份 //额外定义两个变量,分别代表剩下多少钱,剩下多少份 int leftMoney = totalMoney; int leftCount = totalCount; //随机发钱n-1个,最后一个不需要随机 for (int i = 0; i <totalCount -1 ; i++) { //按照公式生成随机数 int money = random.nextInt(leftMoney / leftCount * 2)+1; 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.setOwnerName("薛佳旺");//设置群主名称
//普通红包
// OpenMode normal = new NormalMode();//向上转型
// red.setOpenWay(normal);
//随机红包
OpenMode randomMode = new RandomMode();
red.setOpenWay(randomMode);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)