您的位置:首页 > 移动开发 > 微信开发

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

2017-02-11 21:36 330 查看

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

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

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

所有人都能分到红包,也就是不会出现红包数值为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 <people; 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;
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 微信 红包