红包算法分析

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

package红包分配;public classtest {public static voidmain(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.9the number9can get1.71the number8can get1.5176251the number7can get1.3225019the number6can get1.1241267the number5can get0.9217838the number4can get0.71438247the number3can get0.5000677the number2can get0.2750373the number1can get0.027503723there remain-0.01302808

最终剩余的钱数为负数,不符合要求,所以说基数的选取是非常重要的。

设置金额的限额

private static final float MINMONEY = 0.01f;private static final float MAXMONEY = 200f;

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

判断金额是否合法

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

private boolean isRight(float money,intcount)

{double avg = money/count;if(avg

}else if(avg>MAXMONEY)

{return false;

}return true;

}

随机产生红包

用随机方法产生一个在最大值和最小值之间的一个红包,并判断该红包是否合法,是否在产生这个红包之后红包金额变成负数。另外,在这次产生红包值较小时,下一次就产生一个大一点的红包。

private float randomRedPacket(float money,float mins,float maxs,intcount)

{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))

{returnone;

}else{//重新分配

float avg = moneyOther / (count-1);if(avg

{returnrandomRedPacket(money,mins,one,count);

}else if(avg>MAXMONEY)

{returnrandomRedPacket(money,one,maxs,count);

}

}returnone;

}

实现红包分配

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

private static final float TIMES = 2.1f;public List splitRedPackets(float money,intcount)

{if(!isRight(money,count))

{return null;

}

List list = new ArrayList();float max = (float)(money*TIMES/count);

max= max>MAXMONEY?MAXMONEY:max;for(int i=0;i

{float one = randomRedPacket(money,MINMONEY,max,count-i);

list.add(one);

money-=one;

}returnlist;

}

private static final float TIMES = 2.1f;public List splitRedPackets(float money,intcount)

{if(!isRight(money,count))

{return null;

}

List list = new ArrayList();float max = (float)(money*TIMES/count);

max= max>MAXMONEY?MAXMONEY:max;for(int i=0;i

{float one = randomRedPacket(money,MINMONEY,max,count-i);

list.add(one);

money-=one;

}returnlist;

}

编写主函数

public static voidmain(String[] args) {

RedPacketUtil util= newRedPacketUtil();

System.out.println(util.splitRedPackets(200, 100));

}

java实现红包要多少钱_java实现微信红包分配算法(示例代码)相关推荐

  1. java实现红包要多少钱_java实现微信红包分配算法

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 java 实现微信红包分配算法 2017/03/25 0 红包算法分析有人认为,抢红包的额度是从 0.01 到剩余平均值 *N(N 是一个系数,决 ...

  2. java实现红包要多少钱_Java实现发红包模拟

    packagecom.cmk;import javax.swing.*;import java.awt.*;importjava.awt.event.KeyAdapter;importjava.awt ...

  3. java实现红包要多少钱_Java实现发红包功能

    Java发红包案例,供大家参考,具体内容如下 首先我们需要分析这个代码的架构是什么,需要什么类组成等. 我们需要建立4个类,这4个类分别是用户类.群主类.成员类,运行类: 因为群主类和成员类都有共同的 ...

  4. 售后退款的java代码_SpringBoot 微信退款功能的示例代码

    一:微信支付证书配置 二:证书读取以及读取后的使用 package com.zhx.guides.assistant.config.wechatpay; import org.apache.commo ...

  5. 用c语言写的新年搞笑祝福程序,新年微信红包搞笑句子_2020新年幽默微信红包祝福语...

    每逢佳节,大家都喜欢用发红包的方式来表示祝福和祝愿.但随着支付手段日新月异,更多市民喜欢发支付宝红包.微信红包.以下是小编给大家整理的新年微信红包搞笑句子_2020新年幽默微信红包祝福语,希望可以帮到 ...

  6. java实现红包要多少钱_JAVA实现简单抢红包算法(模拟真实抢红包)

    闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这 ...

  7. java实现红包要多少钱_java实现红包的分配算法

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

  8. java开发保险案例_Java实现双保险线程的示例代码

    双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响. 两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳 如果时间戳超过休眠时间3倍没有更新的话,则重新启动对方线程. 例子 ...

  9. java异常判断_Java异常退出条件的判断示例代码

    无论是功能性代码还是算法性代码,程序都是一系列流程的合集 既然是流程就分为:一般流程和异常流程: 一般流程保证了基本功能: 异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了: 注意,布 ...

最新文章

  1. Notepadd++主题推荐
  2. nodejs ajax进度条,Ajax异步文件上传与NodeJS express服务端处理的示例分析
  3. Slax Linux安装——备忘篇
  4. GLSL实现HDR Rendering 【转】
  5. jsf tree组件_JSF和“立即”属性–命令组件
  6. vCenter线上操作磁盘扩容
  7. Convert.Int32、(int)和int.Parse三者的区别
  8. 玩Azkaban跳过的坑
  9. /etc目录下重要文件解释
  10. zookeeper专题:使用zookeeper客户端实现动态监听节点并获取数据
  11. Anaconda3+Python3.6搭建Tensorflow
  12. CODE:BLOCK中的CreateProcess: No such file or directory
  13. [轉]javascript 的 location 各種用法
  14. sqlserver 数据库文件损坏、数据库可疑修复处理
  15. H3CSE园区-组播路由协议
  16. python blp模型 估计_python实践——时间序列分析建模理论及代码实现
  17. Hibernate的4种继承关系
  18. 2019xman-shellmaster wp
  19. SSL协议与Nginx安装SSL模块和ssl证书
  20. mapbox+threejs实现三维气泡球体专题图

热门文章

  1. 「镁客·请讲」火柴全景VR徐晨翔:正值VR本命年,我们该做一些不一样的事情...
  2. WITH AS的用法
  3. Android Fota(差分包)制作
  4. Presentation 技巧总结
  5. 托管代码和非托管代码的区别
  6. 对于制造业来说,MES实现批次管理有何重要因素?
  7. IT十年人生过客-二十七-艰难
  8. 专线与家庭宽带的区别?
  9. 机器学习-3:MachineLN之dl
  10. 《解忧杂货店》—— 读后总结