二倍均值法红包金额分配算法
背景:
为了避免高必发引起的一些问题,每个人领取红包的觉得金额不能在拉取的时候才计算,必须先计算好每个红包拆出的金额,并把他们放在一个队列里,领取红包的用户要在队列中找到属于自己的那一份。
算法的Java 实现:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RedPackage {
public static void main(String[] args) {
List<Integer> amountList=divideRedPackage(10000,10);
for(Integer amount:amountList)
{
System.out.println("抢到金额:"+new BigDecimal(amount).divide(new BigDecimal(100)));
}
}
/*
* @param totalAmount 总金额(以分为单位)
* @param totalPeopleNum 总人数
* */
public static List<Integer> divideRedPackage(Integer totalAmount,Integer totalPeopleNum)
{
List<Integer> amountList=new ArrayList<Integer>();
Integer restAmount=totalAmount;
Integer restPeopleNum=totalPeopleNum;
Random random=new Random();
for (int i=0;i<totalPeopleNum-1;i++)
{
int amount=random.nextInt(restAmount/restPeopleNum*2-1)+1;
restAmount-=amount;
restPeopleNum--;
amountList.add(amount) ;
}
amountList.add(restAmount);
return amountList;
}
}