微信红包随机分配算法初探

微信红包随机分配算法初探

大家平时都在使用微信收发红包,玩的不亦乐乎。别人在抢红包,而程序员在研究红包算法。那么微信红包的随机分配算法是怎么实现的呢?怎么保证没人都领得到,而且满足正态分布呢?我猜想的算法大概是这样的

红包领了不少,据观察红包主要有以下几个限制条件:

  • 所有人都能分到红包,也就是不会出现红包数值为0的情况。
  • 所有人的红包数值加起来等于支付的金额。
  • 红包波动范围比较大,约5%~8%的红包数值在平均值的两倍以上,同时数额0.01出现的概率比较高。
  • 红包的数值是随机的,并且数值的分布近似于正态分布。

假设

比如100元,由10个人分,那么平均一个人是10元钱。然后付款后,系统开始分份儿。
第一份:系统由0~10元之间随机一个数,作为这一份的钱数,设x1。
第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2
.。。。
第n份:剩下的钱(100-x1-x2-…-xn),系统由0~(100-x1-x2-…-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn。

代码块实如下

package com.qidi.platform.ui.logging;

import java.util.Random;
/**
 *  微信红包分配算法@柒地科技
 * @author 超哥
 * @version v 1.0
 *
 */
public class WeixinMoney {

    private int peoples; //几个人分
    private double allMoney; //总金额


    public WeixinMoney(int  peoples,int allMoney){
        this.peoples =peoples;
        this.allMoney = allMoney;




    }


    public static double getMoney(WeixinMoney wmoney){
         if (wmoney.getPeoples()==1) {
             wmoney.setPeoples(0);
             return wmoney.getAllMoney();
         }
         //随机分配算法
         Random r     = new Random();
         double min   = 0.01; //
         double max = wmoney.getAllMoney()/wmoney.getPeoples()*2;

         double money = r.nextDouble()*max;
         money = money <= min ? 0.01: money;
         money = Math.floor(money * 100) / 100;

         wmoney.setPeoples(wmoney.getPeoples()-1);
         wmoney.setAllMoney(wmoney.getAllMoney()-money);

         return money;


    }

    public static void main(String[] args) {
        int people = 5;
        WeixinMoney w  = new WeixinMoney(people, 100);
        double all  =0d;
        for (int i = 0; i double d = WeixinMoney.getMoney(w);
            System.out.println(d);
            all+=d;
        }
        System.out.println("总共=="+all);
    }










    public int getPeoples() {
        return peoples;
    }
    public void setPeoples(int peoples) {
        this.peoples = peoples;
    }


    public double getAllMoney() {
        return allMoney;
    }


    public void setAllMoney(double allMoney) {
        this.allMoney = allMoney;
    }






}

微信红包随机分配算法初探_第1张图片

你可能感兴趣的:(java,web,开发)