package com.example.ant.common.tools;

import java.util.LinkedList;

import java.util.List;

/**

* 描述:红包算法

* User: 曾远征

* Date: 2018-09-17

* Time: 14:09

*/

public class RedPacketTools {

/**

* 生成红包最小值 1分

*/

private static final int MIN_MONEY = 1;

/**

* 生成红包最大值 200人民币

*/

private static final int MAX_MONEY = 200 * 100;

/**

* 小于最小值

*/

private static final int LESS = -1;

/**

* 大于最大值

*/

private static final int MORE = -2;

/**

* 正常值

*/

private static final int OK = 1;

/**

* 最大的红包是平均值的 TIMES 倍,防止某一次分配红包较大

*/

private static final double TIMES = 2.1F;

private int recursiveCount = 0;

private List splitRedPacket(int money, int count) {

List moneys = new LinkedList<>();

//计算出最大红包

int max = (int) ((money / count) * TIMES);

max = max > MAX_MONEY ? MAX_MONEY : max;

for (int i = 0; i < count; i++) {

//随机获取红包

int redPacket = randomRedPacket(money, MIN_MONEY, max, count - i);

moneys.add(redPacket);

//总金额每次减少

money -= redPacket;

}

return moneys;

}

private int randomRedPacket(int totalMoney, int minMoney, int maxMoney, int count) {

//只有一个红包直接返回

if (count == 1) {

return totalMoney;

}

if (minMoney == maxMoney) {

return minMoney;

}

//如果最大金额大于了剩余金额 则用剩余金额 因为这个 money 每分配一次都会减小

maxMoney = maxMoney > totalMoney ? totalMoney : maxMoney;

//在 minMoney到maxMoney 生成一个随机红包

int redPacket = (int) (Math.random() * (maxMoney - minMoney) + minMoney);

int lastMoney = totalMoney - redPacket;

int status = checkMoney(lastMoney, count - 1);

//正常金额

if (OK == status) {

return redPacket;

}

//如果生成的金额不合法 则递归重新生成

if (LESS == status) {

recursiveCount++;

System.out.println("recursiveCount==" + recursiveCount);

return randomRedPacket(totalMoney, minMoney, redPacket, count);

}

if (MORE == status) {

recursiveCount++;

System.out.println("recursiveCount===" + recursiveCount);

return randomRedPacket(totalMoney, redPacket, maxMoney, count);

}

return redPacket;

}

/**

* 校验剩余的金额的平均值是否在 最小值和最大值这个范围内

*

* @param lastMoney

* @param count

* @return

*/

private int checkMoney(int lastMoney, int count) {

double avg = lastMoney / count;

if (avg < MIN_MONEY) {

return LESS;

}

if (avg > MAX_MONEY) {

return MORE;

}

return OK;

}

public static void main(String[] args) {

RedPacketTools redPacket = new RedPacketTools();

List redPackets = redPacket.splitRedPacket(20000, 100);

System.out.println(redPackets);

int sum = 0;

for (Integer red : redPackets) {

sum += red;

}

System.out.println(sum);

}

}

java红包记录_微信红包算法(java)相关推荐

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

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

  2. java 实现组合_排列组合算法(JAVA实现)

    组合算法实现 从m个数里面取n个数的算法.最容易理解的就是递归,但是其效率太低. 实现方法一: // 组合算法 // 本程序的思路是开一个数组,其下标表示1到n个数,数组元素的值为1表示其下标 //  ...

  3. java贝叶斯_贝叶斯算法Java实现

    前言:朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法.贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务.概率推理是与确定性推理相对应的. ...

  4. 微信红包数字变化动态图片_微信红包数字动图下载_微信动态图片红包图下载_游戏吧...

    微信红包动图数字是一款有趣的实用工具,在这里用户能够通过软件进行简单的编辑来让自己发出的红包会就这样动起来,还等什么,感兴趣的话就快来下载体验吧! 下载使用教程 红包的使用教程在下载使用教程的下方,也 ...

  5. java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现

    [Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...

  6. python模拟微信发红包算法_微信红包的随机算法是怎样实现的?

    有人问过微信的人,大致是这样: 先上代码: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余 ...

  7. 微信红包随机数字_微信红包随机算法转载

    php固定红包 + 随机红包算法 1 需求 CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法. 1 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行. 2 随 ...

  8. 微信红包随机数字_微信红包的随机算法

    概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.采取实时计算金额的考虑:预算需要 ...

  9. js微信抢红包脚本代码_微信红包算法(js)

    下面实现一个微信红包的抽奖模拟,听说是微信的官方算法,我不确定,先看下实现思路(源码在文章最后): 设置最小金额为0.01,最大金额为剩余金额/剩余红包数量的2倍 在最大最小金额之间取一个随机数作为红 ...

最新文章

  1. metaSPAdes:新型多功能宏基因组拼接工具
  2. hibernate同时插入两条相同数据(偶尔)原因调查
  3. Spring事务原理一探
  4. Block Coordinate Descent
  5. MySQL 迁移到半同步模式
  6. 前端学习(1499):组件特点
  7. BZOJ 1191 [HNOI2006]超级英雄Hero
  8. 硬盘数据恢复入门教程
  9. Bailian3178 开关电灯【模拟】
  10. 基于Vue、vue-i18n实现国际化(多语言)
  11. 用Vim查看和编辑二进制文件
  12. Enhancing Social Recommendation with Adversarial Graph Convolutional Networks个人笔记
  13. Matlab似然比检验函数,似然比检验 LRT
  14. Qt实现word文档转html
  15. 获取客户端真实IP方法
  16. GAN动漫人像生成实现(附带源码)
  17. ubuntu中用vscode编译调试C\C++
  18. 【3dsmax新手入门】-实体立方八面晶体绘制
  19. HI-LINK KT210 Al人脸识别串口通信协议
  20. 渗透测试业务逻辑测试汇总—专项篇

热门文章

  1. lingo变量无限制版本_【运筹学】用Lingo求解运输问题,兼谈Lingo语法
  2. kindle刷多看系统_疑问解答 | kindle真的能护眼吗?
  3. 字符串和字符数组的关系
  4. android点击改变背景色的动画,Lottie-android 修改动画颜色
  5. linux主从库配置文件,linux 数据库主从同步配置
  6. 使用Buildroot为Nxp i.mx6ul制作文件系统
  7. linux安装教程 ce,docker CE安装教程
  8. python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...
  9. SOA架构下的人事信息管理系统的构建与分析
  10. springboot 中根据数据库表生成所有表的model,mapper和xml文件