Java实现仿微信红包分配规则
最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微信红包,我们知道没人随机的最小红包是1分,最大金额是200元,这里我们同样来设置红包的范围,下面代码我们统一金钱的单位为分。 //最小红包额度 private static final int MINMONEY = 1; //最大红包额度 private static final int MAXMONEY = 200 * 100; 二、判断红包金额是否合法 private boolean isRight(int money,int count) { double avg = money / count; if (avg < MINMONEY) { return false; } if (avg > MAXMONEY) { return false; } return true; } 三、随机产生一个红包 private int random(int money,int minS,int maxS,int count) { //红包数量为1,直接返回金额 if (count == 1) { return money; } //如果最大金额和最小金额相等,直接返回金额 if (minS == maxS) { return minS; } int max = maxS > money ? money : maxS; //随机产生一个红包 int one = ((int)Math.rint(Math.random() * (max - minS) + minS)) % max + 1; int money1 = money - one; //判断该种分配方案是否正确 if (isRight(money1,count -1)) { return one; } else { double avg = money1 / (count - 1); if (avg < MINMONEY) { //递归调用,修改红包最大金额 return random(money,minS,one,count); }else if (avg > MAXMONEY) { //递归调用,修改红包最小金额 return random(money,maxS,count); } } return one; } 四、实现红包分配 //每个红包最大是平均值的倍数 private static final double TIMES = 2.1; public List<Integer> splitRedPackets(int money,int count) { if (!isRight(money,count)) { return null; } List<Integer> list = new ArrayList<Integer>(); //红包最大金额为平均金额的TIMES倍 int max = (int) (money * TIMES / count); max = max > MAXMONEY ? MAXMONEY : max; for (int i = 0; i < count; i++) { int one = random(money,MINMONEY,max,count - i); list.add(one); money -= one; } return list; } 红包分配方案评估 上面介绍了红包的基本算法,下面我们就对算法进行一次验证,假设有一个200元100份的红包,我们来看一下最后的分配方案。 完整代码 /** *@Description: */ package com.lulei.weixin.util; import java.util.ArrayList; import java.util.List; import com.lulei.util.JsonUtil; public class RedPacketUtil { //最小红包额度 private static final int MINMONEY = 1; //最大红包额度 private static final int MAXMONEY = 200 * 100; //每个红包最大是平均值的倍数 private static final double TIMES = 2.1; /** * @param money * @param count * @return * @Author:lulei * @Description: 拆分红包 */ public List<Integer> splitRedPackets(int money,count - i); list.add(one); money -= one; } return list; } /** * @param money * @param minS * @param maxS * @param count * @return * @Author:lulei * @Description: 随机红包额度 */ private int random(int money,count); } } return one; } /** * @param money * @param count * @return * @Author:lulei * @Description: 此种红包是否合法 */ private boolean isRight(int money,int count) { double avg = money / count; if (avg < MINMONEY) { return false; } if (avg > MAXMONEY) { return false; } return true; } public static void main(String[] args) { // TODO Auto-generated method stub RedPacketUtil util = new RedPacketUtil(); System.out.println(JsonUtil.parseJson(util.splitRedPackets(20000,100))); } } 更多精彩内容请点击《Android微信开发教程汇总》,《java微信开发教程汇总》欢迎大家学习阅读。 以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |