二倍均值法

原理

原理

剩余红包金额M,剩余人数N,那么:每次抢到金额=随机(0,M/N*2)

保证了每次随机金额的平均值是公平的

假设10人,红包金额100元

第一人:100/10*2=20,随机范围(0,20),平均可以抢到10元

第二人:90/9*2=20,随机范围(0,20),平均可以抢到10元

第三人:80/8*2=20,随机范围(0,20),平均可以抢到10元

以此类推,每次随机范围的均值是相等的

缺点

除了最后一次,任何一次抢到的金额都不会超过人均金额的两倍,并不是任意的随机

/**

* 二倍均值算法,金额为分

*

* @param totalAmount 总金额

* @param totalPeopleNum 总人数

* @return

*/

public List divideRedPackage(Integer totalAmount, Integer totalPeopleNum) {

List amountList = new ArrayList<>();

//总金额

Integer restAmount = totalAmount;

//总人数

Integer restPeopleNum = totalPeopleNum;

Random random = new Random();

for (int i = 0; i < totalPeopleNum - 1; i++) {

//随机范围:[1,剩余人均金额的两倍),左闭右开

int amount = random.nextInt(restAmount / restPeopleNum * 2 - 1) + 1;

restAmount -= amount;

restPeopleNum--;

amountList.add(amount);

}

//最后一个剩余的金额

amountList.add(restAmount);

return amountList;

}

public static void main(String[] args) {

RedEnvelopes redEnvelopes = new RedEnvelopes();

List amountList = redEnvelopes.divideRedPackage(500, 10);

for (Integer amount : amountList) {

System.out.println("抢到金额:" + new BigDecimal(amount).divide(new BigDecimal(100)));

}

}

复制代码

运行结果:

抢到金额:0.09

抢到金额:0.37

抢到金额:0.22

抢到金额:0.01

抢到金额:0.15

抢到金额:1.02

抢到金额:0.53

抢到金额:1.43

抢到金额:0.66

抢到金额:0.52

复制代码

java开发抢红包算法,抢红包算法的实现-java相关推荐

  1. Java开发 三角形算法汇总

    Java开发 三角形算法汇总 文章简介 直角三角形算法 取边长 任意三角形 求边长 求夹角 文章简介 本文汇总一下三角形算法,包含 求边长.求角度等常用函数 直角三角形算法 取边长 勾股定理,是一个基 ...

  2. Java程序设计(Java9版):第1章 Java开发环境配置 (Set up Java development environment)

    第1章Java开发环境配置(Set up Java development environment) 工欲善其事,必先利其器. - <论语·卫灵公> Write once, run any ...

  3. 高级java开发_我最喜欢的Java高级开发人员书籍

    高级java开发 我上一篇博客文章 (我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的"面向高级Java开发人员的十大网站"的启发. Wa ...

  4. alibaba java_阿里巴巴JAVA开发手册最新版插件Alibaba Java Coding Guidelines安装及使用...

    阿里巴巴JAVA开发手册最新版插件Alibaba Java Coding Guidelines安装及使用 发布时间:2018-04-20 14:40, 浏览次数:887 , 标签: JAVA Alib ...

  5. 北京java研发平均工资_各地java开发工程师平均工资 北京高级java开发工程师工资2万多...

    原标题:各地java开发工程师平均工资 北京高级java开发工程师工资2万多 java开发工程师工资水平一直都是程序员们比较关注的话题,毕竟java是最热门的编程的语言.每个城市的由于经济水平的差距, ...

  6. Java开发初体验:第一个Java程序:HelloWorld

    文章目录 2.1 java语言的环境搭建 2.2 开发体验:HelloWorld 2.3 注释(Comment) 2.4 Java API文档 2.5 常用的Java开发工具(Integrated D ...

  7. 在高频交易领域中,为什么我们选择 Java 开发外汇算法交易系统?

    在高频交易的世界中,自动化应用程序每天处理数亿个市场信号,并在全球各个交易所发送成千上万的订单. 为了保持业务竞争力,响应时间必须始终保持在微秒级,尤其是在黑天鹅异常事件等高峰期. 在典型的体系结构中 ...

  8. java 排序算法面试题_面试题: java中常见的排序算法的实现及比较

    1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始,然后依次和剩余的元素进行比较,若小于相邻元素,则交换两者位置,同时将较大元素作为下一个比较的基准元素,继续将该元素与其相邻 ...

  9. Java版cityHash64 与cityHash128算法的实现

    简介 cityhash系列字符串散列算法是由著名的搜索引擎公司Google 发布的 (http://www.cityhash.org.uk/).Google发布的有两种算法:cityhash64 与 ...

  10. 网易严选Java开发三面面经:java读文件内容

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

最新文章

  1. sap系统工单关闭_什么样的系统算是坑
  2. Uipath 学习栏目基础教学:1Uipath设计器介绍
  3. 「JupyterNotebook-bug」Jupyter Notebook卸载已安装的第三方库不能输入yes的问题
  4. 乐器演奏_深度强化学习代理演奏的蛇
  5. python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...
  6. 请对比html与css的异同,css3与css2的区别是什么?
  7. 年薪 50w+ 的程序员,是这样写代码的?
  8. 一文快速探索视频用户网络画像与应用
  9. WOW超大规模场景资源管理方法的尝试
  10. 查看oracle是否删除干净,n你好,之前卸载了oracle,该怎么查看以前Oracle卸载干净没?...
  11. react 如何引入打印控件 CLodop
  12. php excel导出pdf文件,如何修复“无法加载PDF呈现库”使用PHPExcel TCPDF将Excel导出为PDF...
  13. python爬虫-国家企业_国家企业信用公示系统的爬取
  14. UE4_关于Roll,Yaw,Pitch,Rotator的理解
  15. 如何写出好的SEO标题,网页标题SEO优化的方法
  16. 硬盘存储双寡头之争 希捷重注中国市场或赢大丰收
  17. 通过iptables 禁止访问域名方法整合
  18. Microsoft Office 2007不能安装的原因
  19. 智能家居到智慧家庭-由远程操作设备到家庭智慧服务
  20. 乐讯机器人精简版2016迎春版【隆重发布】

热门文章

  1. 全局修改样式(全局颜色更改)
  2. 小何讲进程: 编写Linux守护进程方法详解
  3. 用python画漂亮的生日蛋糕_一步一步最简单的最漂亮的画蛋糕
  4. 如何通过安装包安装应用到手机
  5. Android中检测应用是否安装
  6. Python Pygame制作简单五子棋游戏(详细代码+解释)
  7. 智信分销拼团拍卖商城v3.38.3
  8. Android多线程断点续传下载原理及实现,移动开发工程师简历
  9. ABB机器人编程随记
  10. python中import string是什么意思_python string是什么