/*红包处理过程中出现0.00以后的尾数处理办法。

先获取List<Double>数据可由red(int number, double total, double min) 获取。

获取后用red_all_count(List<Double> red_all_count)可以获取总金额,进行一个对比,红包数少误差小,生成的红包数越多,误差可能越大。

*/

//测试

public static void main(String[] args) {
List<Double> ld=red(1000, 5000, 0.01);
red_all_count(ld);
}

/**
* @param red_all_count
* @return 总金额
*/
public static double red_all_count(List<Double> red_all_count){
double dou=0.0;
for (Double double1 : red_all_count) {
dou+=double1;
}
BigDecimal bg = new BigDecimal(dou);
   double d3 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return d3;
}

/**

* @param 总份数:number
* @param 总金额:total
* @param 最小金额:min
* return doubleList
*/
public static List<Double> red(int number, double total, double min) {

// 红包数
// 红包总额
double money;
// 最小红包
double max;
int i = 1;
List<Double> list = new ArrayList<Double>();
if (number == 1) {
list.add(total);
return list;
}
DecimalFormat df = new DecimalFormat("###.##");
while (i < number) {
// 保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值
max = total - min * (number - i);
int k = (int) (number - i) / 2;
// 保证最后两个人拿的红包不超出剩余红包
if (number - i <= 2) {
k = number - i;
}
// 最大的红包限定的平均线上下
max = max / k;
// 保证每个红包大于最小值,又不会大于最大值
money = (int) (min * 100 + Math.random()
* (max * 100 - min * 100 + 1));
money = (float) money / 100;
// 保留两位小数
money = Double.parseDouble(df.format(money));
if(money<0.01){
money=DoubleUtil.changeDoubleTwo(min);
}
total = (int) (total * 100 - money * 100);
total = total / 100;
System.out.println("剩余金额:"+total+",本次生成红包:"+DoubleUtil.changeDoubleTwo(money));
list.add(money);
i++;
// 最后一个人拿走剩下的红包
if (i == number) {

list.add(total);

System.out.println("剩余金额:"+total+",本次生成红包:"+DoubleUtil.changeDoubleTwo(money));

}
}
// 取数组中最大的一个值的索引

return list;

}

java红包算法·返回ListDouble相关推荐

  1. java 红包算法_JAVA实现拼手气红包算法

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  2. java红包记录_微信红包算法(java)

    package com.example.ant.common.tools; import java.util.LinkedList; import java.util.List; /** * 描述:红 ...

  3. java微信红包开发_微信红包算法(java)

    package com.example.ant.common.tools; import java.util.LinkedList; import java.util.List; /** * 描述:红 ...

  4. java红包正态分布_红包分配算法

    微信红包的分配算法,在知乎上已经有人讨论过了,详见<微信红包的随机算法是怎样实现的?>.基本的原则是:红包分配的钱数满足截尾正态随机数分布. 大致为在截尾正态分布中取随机数,并用其求和数除 ...

  5. java红包金额随机数算法_实时随机数算法(微信红包分配算法)

    微信红包算法在知乎上面有个专题讨论,其实红包的发放的随机算法,有两种作法:java 一.预生产: 算法 无外乎是在发红包的时候,随机去把金额生成到某个容器当中,而后要用的时候,一个一个的POP:微信 ...

  6. Java 实现红包算法

    public class RedPacket {/*** 生成红包最小值 1分*/private static final int MIN_MONEY = 1;/*** 生成红包最大值 200人民币* ...

  7. 一不小心错过的几个亿还可以再回来!解密微信红包算法

    前言 ◆ ◆ ◆ ◆ 还记得2017年,微信红包收发总量达到460亿个,2019年,除夕到初五,8.23亿人收发微信红包.一觉醒来,微信群里各种红包,顿时觉得错过了几个亿,破解了红包的规律,是不是就可 ...

  8. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  9. JAVA经典算法50题(转)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1]   题目:古典问题:有一对兔子, ...

最新文章

  1. 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)
  2. linux oracle path恢复,Linux 环境下Oracle安装与调试(七)之SQL Loader,备份和恢复
  3. 一文带你读懂Python的5大特点与8大应用方向!
  4. Django报错:mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required, you have 0.9.3的解决办法
  5. 操作系统习题8—设备管理
  6. 1874: 生活大爆炸版石头剪刀布
  7. Spring3.2.4集成quartz2.2.1定时任务(demo).
  8. CRM Excel导出技术实现的调试截图
  9. 解决spring和struts配合问题
  10. c语言在单行文本上删除子串,一道比较简单的题——PTA基础编程题目集 7-29 删除字符串中的子串 C语言试解-Go语言中文社区...
  11. Ising模型(伊辛模型)
  12. ssm电影院订票系统 前端layui
  13. python3网络爬虫-介绍
  14. 导入、配置Vuetify遇到的的几个问题
  15. android自动夜间模式,Android实现日夜间模式的深入理解
  16. 【★】生成树算法终极解析!
  17. Win10下运行复活之秦殇前传
  18. 百度天气API 获取天气
  19. 9. TCP拥塞控制
  20. pythoncookie自动登录_Python爬虫连载6-cookie深入使用实例化实现自动登录

热门文章

  1. 机器学习基础-最近邻规则分类 KNN (K-Nearest Neighbor)-11
  2. 机器学习:使用numpy实现数据增强(Data Augmentation)
  3. 图形结构:安排课程,图的遍历策略
  4. 动态规划,从例子到理解
  5. 如何优化MySQL千万级大表
  6. web.xml中的ContextLoaderListener和DispatcherServlet区别
  7. 虚拟化技术知识点初步梳理
  8. 编写代码约定,每行字符长度不超过80列
  9. 【4】 Java基础 四
  10. Educational Codeforces Round 30 C