Java实现微信红包分配规则

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;
}
三、随机产⽣⼀个红包
这⾥我们采⽤随机的⽅式产⽣⼀个在MINMONEY和MAXMONEY之间的⼀个红包,产⽣红包之后,我们需要判断剩余的钱是否是合法红包,如果不是合法红包,我们就重新产⽣分配⽅案,在重新产⽣分配⽅案的时候,我们需要确定⼀个事情,是产⽣的红包过⼤还是过⼩,如果红包过⼤,下次就随机⼀个⼩值到本次红包⾦额的⼀个红包,如果红包⾦额过⼩,我们就产⽣⼀个红包⾦额到⼤值的⼀个红包。

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, one, maxS, count);
}
}
return one;
}
四、实现红包分配
这⾥为了避免某⼀个红包占⽤⼤量资⾦,我们需要设定⾮最后⼀个红包的最⼤⾦额,我们把他设置为红包⾦额平均值的N倍;
有了⼀、⼆、三中的⽅法,我们就可以来实现红包的分配了。

//每个红包最⼤是平均值的倍数
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, 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;
}
/**
* @param money
* @param minS
* @param maxS
* @param count
* @return
* @Author:lulei
* @Description: 随机红包额度
*/
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, one, maxS, 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))); }
}
更多精彩内容请点击《》,《》欢迎⼤家学习阅读。

以上就是本⽂的全部内容,希望对⼤家学习java程序设计有所帮助。

相关文档
最新文档