import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
/**
*
* 模拟微信分配红包
* 最小值为0.01*红包数
* 最大值为200
*
* @author Cralchan
*
*
*/
public class RedPacket {
private final float MINVALUE = 0.01f;//设定红包最小值
private final float MAXVALUE = 200f;//设定红包最大值
/**
* 判断红包金额是否合理
* @param money
* @param count
* @return
* @throws Exception
*/
public boolean isRight(float money, int count){
float avg = money/count;
if(avg<MINVALUE){ //如果分配的单个红包小于系统的最小值,则判定为不合法
return false;
}
if(MAXVALUE<money){ //如果输入的红包大于系统的最大值,则判定为不合法
return false;
}
return true;
}
/**
* 分红包算法(获得红包)
* @param money
* @param MINVALUE
* @param MAXVALUE
* @param count
*/
public float randomPacket(float money, float minValue, float maxValaue, int count){
float maxMoney = 0; //定义随机分配区间最大值
if(count==1){ //判断是否为最后一次分配
return money;
}
if(minValue==maxValaue){ //如果最小值与最大值相等,则返回当前值
return money;
}
maxMoney = maxValaue>money?money:maxValaue; //获得随机分配最大区间
float one = (float) (Math.random()*(maxMoney-minValue)+minValue); //随机产生一个红包
//判断此次红包分配是否合理
float blance = money - one;
if(isRight(blance, count-1)){
return one;
}else{
float avg = blance/(count-1);
//如果本次分得的红包过大导致接下来没法继续分配
if(avg<MINVALUE){
return randomPacket(money, minValue, one, count);
}else{
return randomPacket(money, one, maxValaue, count);
}
}
}
/**
* 分配红包
* @param money
* @param count
* @return
*/
@SuppressWarnings("finally")
public List<Object> spiltRedPacket(float money, int count){
//判定红包金额是否合法
if(money<MINVALUE*count||money>MAXVALUE){
try {
throw new Exception("您输入的红包金额不合法!");
} catch (Exception e) {
e.printStackTrace();
}finally {
return null;
}
}
List<Object> list = new ArrayList<>();//创建红包集合
float max = money/count*2f; //防止某个红包占用大量资金,设定非最后一个红包的最大金额,把它设置成平均数的N倍;
max = max>money?money:max;
DecimalFormat decimalFormat = new DecimalFormat("0.00");//只取得小数点后两位数
for (int i = 0; i < count; i++) {
float randomRedPacket = randomPacket(money, MINVALUE, max, count-i);
String format = decimalFormat.format(randomRedPacket);
Float valueOf = Float.valueOf(format);
list.add(valueOf);
money -= valueOf;
}
return list;
}
/**
* 程序测试
* @param args
*/
@SuppressWarnings("unused")
public static void main(String[] args) {
RedPacket packet = new RedPacket();
List<Object> spiltRedPacket = packet.spiltRedPacket(0.01f, 4);
DecimalFormat decimalFormat = new DecimalFormat("0.00");
for (int i = 0; i < spiltRedPacket.size(); i++) {
String format = decimalFormat.format(spiltRedPacket.get(i));
System.out.println(spiltRedPacket.get(i));
}
}
}