发红包案例分析以及普通红包和手气红包的实践
发红包案例分析
场景说明:红包发出去后所有人都有红包,大家都抢完后,最后一个红包给群主自己
红包分发的策略:
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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix