java实现微信红包分配算法

红包算法分析

package 红包分配;

public class test {
public static void main(String[] args){
float num=10,N=1.9f;
int people=10;
for(int i=0;i<10;i++)
{
System.out.println("the number"+people+"can get "+num/people*N);
num=num-num/people*N;
people--;
}
System.out.println("there remain"+num);
}

}

the number10can get 1.9
the number9can get 1.71
the number8can get 1.5176251
the number7can get 1.3225019
the number6can get 1.1241267
the number5can get 0.9217838
the number4can get 0.71438247
the number3can get 0.5000677
the number2can get 0.2750373
the number1can get 0.027503723
there remain-0.01302808

设置金额的限额

private static final float MINMONEY = 0.01f;
private static final float MAXMONEY = 200f;

判断金额是否合法

private boolean isRight(float money,int count)
{
double avg = money/count;
if(avg<MINMONEY){
return false;
}
else if(avg>MAXMONEY)
{
return false;
}
return true;
}

随机产生红包

private float randomRedPacket(float money,float mins,float maxs,int count)
{
if(count==1)
{
return (float)(Math.round(money*100))/100;
}
if(mins == maxs)
{
return mins;//如果最大值和最小值一样，就返回mins
}
float max = maxs>money?money:maxs;
float one = ((float)Math.random()*(max-mins)+mins);
one = (float)(Math.round(one*100))/100;
float moneyOther = money - one;
if(isRight(moneyOther,count-1))
{
return one;
}
else{
//重新分配
float avg = moneyOther / (count-1);
if(avg<MINMONEY)
{
return randomRedPacket(money,mins,one,count);
}else if(avg>MAXMONEY)
{
return randomRedPacket(money,one,maxs,count);
}
}
return one;
}

实现红包分配

private static final float TIMES = 2.1f;

public List<Integer> splitRedPackets(float money,int count)
{
if(!isRight(money,count))
{
return null;
}
List<Float> list = new ArrayList<Float>();
float max = (float)(money*TIMES/count);

max = max>MAXMONEY?MAXMONEY:max;
for(int i=0;i<count;i++)
{
float one = randomRedPacket(money,MINMONEY,max,count-i);
money-=one;
}
return list;
}
private static final float TIMES = 2.1f;

public List<Integer> splitRedPackets(float money,int count)
{
if(!isRight(money,count))
{
return null;
}
List<Float> list = new ArrayList<Float>();
float max = (float)(money*TIMES/count);

max = max>MAXMONEY?MAXMONEY:max;
for(int i=0;i<count;i++)
{
float one = randomRedPacket(money,MINMONEY,max,count-i);
money-=one;
}
return list;
}

编写主函数

 public static void main(String[] args) {
RedPacketUtil util = new RedPacketUtil();
System.out.println(util.splitRedPackets(200, 100));
}

posted @ 2017-03-26 22:32  Gssol  阅读(14981)  评论(1编辑  收藏  举报