紅包隨機分配的入?yún)ⅲ话阒挥袃蓚€舞骆,總金額與搶紅包的總?cè)藬?shù)富弦。難點是要保證在最后一個人搶完之前沟娱,不能讓剩余錢包為空。所以要控制單人搶到紅包錢數(shù)的最大值與最小值腕柜,并讓這個值在剩余錢數(shù)之下济似。
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class WxReadPackets {
private final float MINVALUE = 0.01f;// 設(shè)定最小紅包
private final float MAXVALUE = 200f;//設(shè)定紅包最大值
public boolean isRight(float money,int count){
if(count<=0){
return false;
}
float avg = money/count;
if(avg<MINVALUE){
return false;
}
if(MAXVALUE<money){
return false;
}
return true;
}
/*
* 分紅包算法(獲得紅包)
* */
public float randomPacket(float money, float minValue, float maxValaue, int count){
float maxMoney = 0; //定義隨機分配區(qū)間最大值
if(count==1){ //判斷是否為最后一次分配
return money;
}
if(minValue==maxValaue){ //如果最小值與最大值相等,則返回當(dāng)前值
return money;
}
maxMoney = maxValaue>money?money:maxValaue; //獲得隨機分配最大區(qū)間
float one = (float) (Math.random()*(maxMoney-minValue)+minValue); //隨機產(chǎn)生一個紅包
float blance = money - one;
if(isRight(blance, count-1)){
return one;
}else{
float avg = blance/(count-1);
//如果本次分得的紅包過大導(dǎo)致接下來沒法繼續(xù)分配....
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<>();//創(chuàng)建紅包集合
float max = money/count*4f; //防止某個紅包占用大量資金砰蠢,設(shè)定非最后一個紅包的最大金額,把它設(shè)置成平均數(shù)的N倍唉铜;
max = max>money?money:max;
DecimalFormat decimalFormat = new DecimalFormat("0.00");//只取得小數(shù)點后兩位數(shù)
//給個紅包人數(shù)分配紅包
for (int i = 0; i < count; i++) {
//保證紅包的金額范圍在minValue 與 max 之間
float randomRedPacket = randomPacket(money, MINVALUE, max, count - i);
String format = decimalFormat.format(randomRedPacket);
Float valueOf = Float.valueOf(format);
list.add(valueOf);
//將分配的金錢在剩余紅包數(shù)中減少台舱,同時減少分配人數(shù)
money -= valueOf;
}
return list;
}
/**
* 程序測試
* @param args
*/
@SuppressWarnings("unused")
public static void main(String[] args) {
WxReadPackets packet = new WxReadPackets();
List<Object> spiltRedPacket = packet.spiltRedPacket(100.00f, 10);
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));
}
}
}