二倍均值法红包金额分配算法

背景:

为了避免高必发引起的一些问题,每个人领取红包的觉得金额不能在拉取的时候才计算,必须先计算好每个红包拆出的金额,并把他们放在一个队列里,领取红包的用户要在队列中找到属于自己的那一份。

算法的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;
    }
}
posted @ 2021-06-25 16:38  面包快跑  阅读(619)  评论(1编辑  收藏  举报