二倍平均值法

优势在于不需要先把每个人得多少算出来,只有拆红包的时候才会算出这个人得多少,减少实时算力
同时保证了每个人拼手气得到的平均值相同
设有10个人,红包总额100元。
100/10X2 = 20, 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。
假设第一个人随机到10元,那么剩余金额是100-10 = 90 元。
90/9X2 = 20, 所以第二个人的随机范围同样是(0,20 ),平均可以抢到10元。
假设第二个人随机到10元,那么剩余金额是90-10 = 80 元。
80/8X2 = 20, 所以第三个人的随机范围同样是(0,20 ),平均可以抢到10元。
以此类推,每一次随机范围的均值是相等的。

  • 截图



  • 代码

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;/*** 微信拼手气红包算法(二倍平均值法)实现示范代码* @author humorchen*/
public class RedPackage {Random random=new Random();/*** 每个红包最小金额*/BigDecimal min=BigDecimal.valueOf(0.01);/*** 将小于1分钱的部分去掉* @param val* @return*/public BigDecimal floor(BigDecimal val){return val.setScale(2,RoundingMode.FLOOR);}/*** 根据红包剩余金额和当前剩余红包数计算本次抢红包抢到了多少钱* @param lastMoney* @param lastPackage* @return*/public   BigDecimal calculate(BigDecimal lastMoney,long lastPackage){if(lastPackage==1){return floor(lastMoney);}BigDecimal ret=floor(lastMoney.multiply(BigDecimal.valueOf(2*random.nextDouble()))).divide(BigDecimal.valueOf(lastPackage),3,RoundingMode.HALF_DOWN);if(ret.compareTo(min)==-1){return min;}ret=floor(ret);return ret;}/*** 给person个人发money元的拼手气红包* @param money* @param person*/public  void sendRedPackage(BigDecimal money,int person){System.out.println(String.format("红包金额:%s,红包%d个",money.toString(),person));for (int i=0;i<person;i++){BigDecimal got=calculate(money,person-i);System.out.println(String.format("第%d个人拼手气得了%s",(i+1),got.toString()));money=money.subtract(got);System.out.println("红包结算后剩余"+money);}}public static void main(String[] args) {new RedPackage().sendRedPackage(BigDecimal.valueOf(0.04),4);}
}

微信拼手气红包算法(二倍平均值法)实现示范代码相关推荐

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

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

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

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

  3. 拼手气红包java_JAVA实现拼手气红包算法

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

  4. 模拟微信拼手气红包程序

    模拟微信拼手气红包程序 有用户输入总金额与红包数,随机给每个红包分配金额 package p03.t010;import java.util.Random; import java.util.Scan ...

  5. 微信拼手气红包C语言,微信拼手气红包算法分析

    好长一段时间了,身边的朋友都是在揣着手机一直在抢红包,都知道抢红包是一件非常有趣的事,还会有人因为抢红包手气差而生气,其实我们是不知道微信红包随机的算法,其实微信红包不单单是靠手气抢大小的,它中间藏着 ...

  6. 水果礼包拼手气(仿红包拼手气)含拼手气红包算法

    现阶段有个需求: 现有一个水果礼包,礼包包含多品类.多规格.多数量的拼手气小红包生成. 转化为简单json 如: 礼包内有 {A={a1=3, a2=1}, B={b1=1}, C={c1=5}} 有 ...

  7. 微信拼手气红包背后的算法逻辑

    业务介绍 相信大家都用过微信发红包功能,如下图所示: 两个输入元素: 1.总金额 单位(元) 2.红包个数 假设输入总金额: 10,红包个数 6 ,大家可以试着发一个这样的红包看看,我相信每个人发出去 ...

  8. 微信拼手气红包C语言,微信拼手气红包背后的算法逻辑

    业务介绍 相信大家都用过微信发红包功能,如下图所示: 两个输入元素: 1.总金额 单位(元) 2.红包个数 假设输入总金额: 10,红包个数 6 ,大家可以试着发一个这样的红包看看,我相信每个人发出去 ...

  9. 设计微信拼手气红包测试用例

    功能测试: 输入的金额数是否为有效字符.设计输入非法字符,例如输入".",粘贴其他汉字字符"一"等: 输入金额是否在有效范围内.设计输入超过左右金额数的边界,金 ...

最新文章

  1. 浅析weak指针的实现
  2. OpenCV watershed分水岭分割算法的实例(附完整代码)
  3. linux ping库函数,Linux 常用基本命令 ping ifconfig
  4. CodeForces 1491G Switch and Flip(结论)
  5. 同底数幂比较大小方法_知识体系构建:初中数学4大知识点及10大解题方法总结(干货)...
  6. android listview asynctask,关于android:ListView + ArrayList + AsyncTask
  7. layui table异步调用数据的时候,数据展示不出来现象解决方案
  8. winform 的exe为什么移动之后不能使用_C++MyDock配置要求、所需运行库、常见问题 初次使用必看...
  9. 每周学习总结11月9日
  10. 2022最全知识点——RF接口自动化框架项目实战
  11. 反思 | 事件总线的局限性,组件化开发流程中通信机制的设计与实现
  12. 植被指数-RVI、NDVI、DVIEVI、GVI、PVI、EVI
  13. 计算机id和密码怎么查,忘记Apple ID账号和密码怎么办?
  14. 李开复就中国移动开发者大会的演讲总结
  15. html+css基础教程入门学习之CSS表格
  16. 【比特熊故事汇】2月MVP英雄故事|有爱的开源
  17. 类似于android短信校验码的demo
  18. 不是所有的大作业都叫微信抢票大作业
  19. 涨知识--地球自转会影响飞机飞行时间吗?
  20. MFC进修笔记2——MFC和Win32

热门文章

  1. 服务器信息泄露,Windows2008 r2“Web服务器HTTP头信息泄露”漏洞修复
  2. 土木工程专业转JAVA的经历总结
  3. LINQ分组查询—GroupBy()
  4. win8计算机开始菜单在哪,win8开始菜单在哪里
  5. android应用市场点击下载APK安装详解
  6. Java实现 LeetCode 242 有效的字母异位词
  7. 深富策略是正规合法平台:公私募称市场不具系统性风险
  8. 以太坊智能合约中 pragma solidity^0.6.10 是什么意思
  9. 线上代码不符合预期?不妨试一下反编译
  10. Laravel防御机制浅析