红包算法分析

有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然为了确保所有人至少有1分钱拿,不能前几个人就把钱拿光了,因此需要有一个判断算法。举个例子,如果每个人都拿了自己的最大值:

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;

红包的最小额度是0.01元,最大额度是200元。

判断金额是否合法

如果金额超过限额,就出错了

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;
}

实现红包分配

为了避免一个红包占用大量的资金,设定非最后一个红包的最大金额,可以设置为平均值的N倍,基于前面的方法就可以实现红包的分配了。

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);
list.add(one);
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);
list.add(one);
money-=one;
}
return list;
}

编写主函数

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

java实现微信红包分配算法的更多相关文章

  1. 研究微信红包分配算法之Golang版

    今天来看一下红包的分配,参考几年前流传的微信红包分配算法,今天用Golang实现一版,并测试验证结果. 微信红包的随机算法是怎样实现的?https://www.zhihu.com/question/2 ...

  2. PHP用抛物线的模型实现微信红包生成算法的程序源码

    <?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;cha ...

  3. PHP微信红包生成算法的程序源码(用抛物线的模型实现)

    代码如下: <?php /* * 红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_defau ...

  4. PHP微信红包的算法实现探讨

    header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10;//红包总额 $num=8;// 分成8 ...

  5. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  6. PHP实现微信红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  7. 如何用 js 实现一个类似微信红包的随机算法

    如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...

  8. java 微信红包算法代码实现及架构设计

    转载至:https://www.zybuluo.com/yulin718/note/93148 微信红包的架构设计简介 架构 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈 ...

  9. java实现红包的分配算法

    个人推测,微信红包在发出的时候已经分配好金额.比如一个10元的红包发给甲乙丙三个人,其实在红包发出去的时候,已经确定了第一个会领取多少,第二个会领取多少金额. 而不是在领取的时候才计算的.下面贴出实现 ...

随机推荐

  1. Swift2.0 函数学习笔记

    最近又有点忙,忙着找工作,忙着适应这个新环境.现在好了,上班两周周了,也适应过来了,又有时间安安静静的就行我们前面的学习了.今天这篇笔记,记录的就是函数的使用.下面这些代码基本上是理清楚了函数的额使用 ...

  2. 如何利用fis3来模拟后台返回数据

    Node 版本要求 0.8.x,0.10.x, 0.12.x,4.x,6.x,不在此列表中的版本不予支持.最新版本 node 支持会第一时间跟进,支持后更新支持列表 1.安装fis3 npm inst ...

  3. Java编程规范(一)

    最近在看一本有关Java编程规范的书,书中精炼阐述了使用java语言时应该遵循的一些原则.接下来的一段时间我将在这里总结我的学习内容,也希望这一系列文章能够对有需要的人有所帮助. 不考虑任何编码规范的 ...

  4. ConOS安装mysql5.7 及简单配置

    安装 保证你的用户有权限 安装  没有 切换 root su root  (su的意思:swich user) # rpm -ivh http://dev.mysql.com/get/mysql57- ...

  5. JAVA设计模式:模板设计模式

    1.模板设计模式,是为了体现继承的作用.它主要的作用就是在类中定义一些公共的方法和标准,而其具体的实现则叫给其子类来根据子类具体的行为来实现:因为模板设计模式中必经还有一些自己的方法不是抽象的方法,只 ...

  6. android学习9——Handler简单用法

    Handler用来发消息和处理消息.典型的用法是更新界面.android不允许在子线程里面更新界面,通常是把Handler传到子线程中,在子线程里通过sendEmptyMessage函数发消息.Han ...

  7. webstorm下的sass自动编译和移动端自适应实践

    1.安装Ruby 2.安装sass 3.webstorm配置file watcher 4.移动端自适应 1.安装Ruby 安装Ruby,有多种方式,打开官网下载 因为,使用的是window选择Ruby ...

  8. zabbix安装详解

    关于zabbix及相关服务软件版本: Linux:centos 6.6 nginx:1.9.15 MySQL:5.5.49 PHP:5.5.35 一.安装nginx: 安装依赖包: yum -y in ...

  9. WEB中调用Nutch执行JOB抓取

    参考:在Eclipse中运行Nutch 把nutch的源代码导入到eclipse工程自定义抓取任务. 下载源码: http://svn.apache.org/repos/asf/nutch/ 从svn ...

  10. Django的URL路由

    URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那 ...