二倍均值法模拟微信抢红包金额算法规则


```java
/*** 二倍均值法* @param amount 总金额* @param min 最小金额* @param num 个数* 本帖只提供思路,实际应用时应根据具体情况改动* 内容若有错误请在评论区指正*/private static void HBTest(BigDecimal amount, BigDecimal min, BigDecimal num) {//总金额-最小金额*个数(这东西的存在就是为了去计算每个人抢多少,还有就是保证每个包里面都有一点钱而且还不能是负数的那种),就把它叫做基数吧BigDecimal remain = amount.subtract(min.multiply(num));//永不可继承的随机数final Random random = new Random();final BigDecimal hundred = new BigDecimal("100");final BigDecimal two = new BigDecimal("2");//BigDecimal.ZERO等价于new BigDecimal(0),BigDecimal.ZERO为BigDecimal的常量数组,直接取出来用就行了,避免重复创建对象BigDecimal sum = BigDecimal.ZERO;//这个就是说这个人抢了多少钱,通过遍历里面的if else赋值BigDecimal redpeck;//普通遍历,num.intValue()意为输出一个int数据,实际应用的时候可不能这么遍历(你品你细品)for (int i = 0; i < num.intValue(); i++) {//生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n,这里的n为100final int nextInt = random.nextInt(100);//最后一个人抢的金额,这里好像有问题,应该是remain = amount.subtract(sum)也就是最后一个人把剩下的所有钱都领走,但是上下文呼应的话好像还只能这么写if(i == num.intValue() -1) redpeck = remain;/*知识点来了小本本拿出来记好(不保证全对,需要验证),内容参考博主well386文章BigDecimal的四舍五入的RoundingMode选择RoundingMode.UP,远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值RoundingMode.DOWN,向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值RoundingMode.CEILING,向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于  RoundingMode.UP;如果结果为负,则舍入行为类似于  RoundingMode.DOWN。注意,此舍入模式始终不会减少计算值RoundingMode.FLOOR,向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于  RoundingMode.DOWN;如果结果为负,则舍入行为类似于 RoundingMode.UP。注意,此舍入模式始终不会增加计算值RoundingMode.HALF_UP,向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同  RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN。注意,此舍入模式就是通常学校里讲的四舍五入RoundingMode.HALF_DOWN,向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同  RoundingMode.UP;否则舍入行为同 RoundingMode.DOWNRoundingMode.HALF_EVEN,向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略RoundingMode.UNNECESSARY,用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。如果对生成精确结果的操作指定此舍入模式,则抛出  ArithmeticException*///不是最后一个人,金额=随机数*(基数*two)/(个数-第几次循环)/hundredelse redpeck = new BigDecimal(nextInt).multiply(remain.multiply(two).divide(num.subtract(new BigDecimal(i)),2,RoundingMode.CEILING)).divide(hundred,2, RoundingMode.FLOOR);//基数大于抢到的金额,基数重新赋值,基数=基数-抢到的金额向上取整保留两位小数if(remain.compareTo(redpeck) > 0) remain = remain.subtract(redpeck).setScale(2, BigDecimal.ROUND_HALF_UP);//如果基数比抢到的金额小,那就给它重新赋值为0else remain = BigDecimal.ZERO;//统计一下已经被领了多少sum = sum.add(min.add(redpeck)).setScale(2, BigDecimal.ROUND_HALF_UP);/*知识点来了小本本拿出来记好(不保证全对,需要验证),内容参考博主Wilson Tsai文章BigDecimal.setScale用法总结BigDecimal b = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_DOWN);//输出2.22,也就是说把2.225667保留两位小数BigDecimal c = new BigDecimal("2.224667").setScale(2, BigDecimal.ROUND_UP);//输出2.23,保留两位小数并且向上取整BigDecimal f = new BigDecimal("2.224667").setScale(2, BigDecimal.ROUND_CEILING);输出2.23,正数,相当于BigDecimal.ROUND_UPBigDecimal g = new BigDecimal("-2.225667").setScale(2, BigDecimal.ROUND_CEILING);//输出-2.22,负数,相当于BigDecimal.ROUND_DOWNBigDecimal h = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_FLOOR);//输出2.22,正数,相当于BigDecimal.ROUND_DOWNBigDecimal i = new BigDecimal("-2.224667").setScale(2, BigDecimal.ROUND_FLOOR);//输出-2.23,负数,相当于BigDecimal.ROUND_HALF_UPBigDecimal d = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_UP);//输出2.23,四舍五入(若舍弃部分>=5,就进位)BigDecimal e = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_DOWN);//输出2.22,四舍五入(若舍弃部分>5,就进位)BigDecimal j = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_EVEN);//输出2.22,如果舍弃部分左边的数字为偶数,则作   ROUND_HALF_DOWNBigDecimal k = new BigDecimal("2.215").setScale(2, BigDecimal.ROUND_HALF_EVEN);//输出2.22,如果舍弃部分左边的数字为奇数,则作   ROUND_HALF_UPBigDecimal l = new BigDecimal("2.215").setScale(3, BigDecimal.ROUND_UNNECESSARY);//断言请求的操作具有精确的结果,因此不需要舍入。//如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。*/System.out.println("第"+(i+1)+"个人抢到红包金额为:"+min.add(redpeck));}System.out.println("红包总额:" + sum);//}// 测试代码public static void main(String[] args) {BigDecimal amount = new BigDecimal(100).setScale(2, BigDecimal.ROUND_HALF_UP);BigDecimal min = new BigDecimal(0.01).setScale(2, BigDecimal.ROUND_HALF_UP);BigDecimal num = new BigDecimal(10).setScale(2, BigDecimal.ROUND_HALF_UP);HBTest(amount,min,num);}
具体结果请自己运行main方法

java模拟微信抢红包金额算法规则二倍均值法模拟(满满的注释)相关推荐

  1. 使用二倍均值法模拟抢红包

    文章目录 场景分析 二倍均值法实现 Java版 JavaScript版 场景分析 微信群发一个红包,金额10元,共10个人抢. 有多种方案: 按先来后到,对每个人: 在[0, 当前剩余金额]区间内生成 ...

  2. 拼手气红包算法_二倍均值法

    使用二倍均值法进行的拼手气红包算法 假设M为总金额,N为抢红包人数,那么根据二倍均值法,每次抢到的金额 = 随机区间 (0, M / N X 2) 这个公式可以确保每个人获取的金额的平均值是相等的,不 ...

  3. 微信拼手气红包算法(二倍平均值法)实现示范代码

    二倍平均值法 优势在于不需要先把每个人得多少算出来,只有拆红包的时候才会算出这个人得多少,减少实时算力 同时保证了每个人拼手气得到的平均值相同 设有10个人,红包总额100元. 100/10X2 = ...

  4. c语言多线程-模拟微信抢红包

    一.背景 想法源于微信.QQ.蓝信抢红包的热情,内部是怎么实现分配处理的呢? 对于单机的情况,是否可以使用多线程去模拟多个用户同时去抢红包? 二.相关知识 大概查找了一下相关的资料[1][2],我理解 ...

  5. 模拟微信抢红包demo,生成随机数

    文章目录 概述 随机数方法方法 Math.random()方法 Random类 抢红包!! 概述 经常抢红包会发现,很大的概率是在一开始得时候抢的红包越大,越靠后越小(大概率是这种情况,这是我的经验之 ...

  6. 抢红包算法 随机法和二倍均值法

    对抢红包,大家肯定不陌生,但是,有想过抢红包是如何实现的嘛?今天就来讨论下抢红包的几种实现. 首先,我们得明确一下需求和需求的限制条件.红包主要有三点限制 抢到的总额 = 红包的总额,不能多也不能少了 ...

  7. 微信抢红包的算法架构总结

    2014 2014 2014 年微信红包使用数据库硬扛整个抢红包流量, 2015 2015 2015 年使用 c a c h e cache cache (缓存). (1)微信红包的金额什么时候算 ? ...

  8. 用python语言模拟微信红包_python 模拟微信抢红包 基础语法实现demo

    1.实现微信抢红包 简易demo版 : 代码如下: from decimalimport Decimal # 提供了随机方法 import random print('$$$$$$weichat模拟微 ...

  9. 编写一个函数,简单模拟微信发红包算法。

    编写一个函数,简单模拟微信发红包算法. 函数有两个参数:一个参数表示红包总金额,默认值为100:另一个参数表示红包数量,默认值为15. 所有随机产生的红包金额(保留两位小数)存放在一个列表(同时作为函 ...

最新文章

  1. 乘风破浪的PTM:两年来预训练模型的技术进展
  2. 4月13日学习笔记——jQuery动画
  3. JUnit和hamcrest的jar包关系
  4. Linux Shell脚本编程--jq命令
  5. SAP Spartacus里的@mixin visible-focus
  6. 轻松学DIV教程(div+css布局)
  7. 95-240-060-源码-state-状态生存时间(TTL)
  8. c语言多线程的建立视频,如何用C语言实现多线程
  9. 谷歌修复已遭利用的 Chrome 0day
  10. rm如何在Linux中删除一个大文件
  11. Hibernate教程01
  12. 数据库表连接之左连接(LEFT JOIN)、右连接(RIGHT JOIN)和内连接(INNER JOIN)
  13. TCP、UDP、Socket、HTTP网络编程面试题(总结最全面的面试题)
  14. 忘了她,就像忘了一朵花
  15. 获取中国银行网页中外汇率
  16. 互联网IT就业市场,你要说最有市场的一定是它
  17. 数据结构--伸展树(伸展树构建二叉搜索树)-学习笔记
  18. Shell脚本实现sshd黑名单
  19. 半导体物理实验 04 - | 椭圆仪测量薄膜厚度
  20. gdb调试,splint_valgrind代码检查

热门文章

  1. libuv 的Processes
  2. 服装销售管理系统设计java_java毕业设计_springboot框架的四季屋服装销售管理系统...
  3. 华夏旅游CMS商城系统操作手册
  4. iphone6 计算机无法检测到照相机,苹果iPhone XR摄像头黑屏不能照相是什么原因?...
  5. 计算机格式化后能恢复数据吗,格式化数据恢复 电脑格式化了还能恢复吗?原来找回如此简单!...
  6. 微信公众号图片素材一键删除小工具
  7. Email营销课堂:邮件群发平台与软件区别
  8. android闪存软件测试,谷歌商店上架一款软件:专门测试华为P10闪存,一秒出结果...
  9. RaspberryPi 4B
  10. LoopBack 出现Handshake inactivity timeout问题