红包在中国传统有着悠久的历史,承载着长辈对晚辈的期许与祝福。微信红包功能上线后,红包不再局限于长辈与晚辈之间,也不再局限于过年这种特殊的时间背景。拼手气红包更是我们乐此不疲的功能。毕竟拼人品谁不爱呢。

那么我们今天就来学习一下怎么样实现红包算法。

红包算法规则

(1) 红包的钱要被这N个人刚好抢完。

(2) 这N个人都需要抢到钱,至少能抢到0.01元。毕竟这是发给N个人的红包,不能有人没收到。

(3) 公平,公平,还是TMD公平。咱这是拼手气,不需要搞什么暗箱操作。

红包算法

二倍均值算法

算法思想

每次的随机范围是[0.01, 剩余人均金额 * 2)。仔细思考一下这个逻辑。抢红包是一种零和博弈,我多抢1分钱就会有人少抢1分钱。我手气差可以吃保底的1分钱,这是下限,我手气好可以抢的多,但是我得做人留一线,最少给别人留1分钱。所以随机区间就是:[0.01, 人均可以金额 * 2)。

算法的缺点是实现了公平但不完全公平,如果前面的人足够运气差的话,后面人的红包会超过前人的上限。

代码

public class RedPacket {public static void devideRedPacket(int amount, int memberCount) {ThreadLocalRandom random = ThreadLocalRandom.current();// 剩余可用金额int amountSurplus = amount;// 剩余未领取人数int memberSurplus = memberCount;for (int i = 0; i < memberCount - 1; i++) {// 理论最大个人可获取金额int maxPersonalAmount = amountSurplus * 2 / memberSurplus;// 实际个人获取金额int realPersonAmount = random.nextInt(1, maxPersonalAmount);amountSurplus -= realPersonAmount;memberSurplus--;System.out.println("第" + (i + 1) +"人抢到" +  (realPersonAmount * 1.0 / 100) + "元。");}System.out.println("第" + memberCount +"人抢到" +  (amountSurplus * 1.0 / 100) + "元。");}public static void main(String[] args) {RedPacket.devideRedPacket(10000, 10);}
}

线段分割法

算法思想

将红包金额换算成一条等长的线段,然后经过随机计算出N - 1个点,将线段截取成N份。每个线段的长度就是每个人所的金额。如果出现重复点,就再次随机。最大的特点就是保证了公平性。

代码

public static void devideRedPacket2(int amount, int memberCount) {ThreadLocalRandom random = ThreadLocalRandom.current();List<Integer> points = new ArrayList<>();// 头和尾points.add(0); points.add(amount);// 生成N-1个端点,将线段分成N份while (points.size() < memberCount + 1) {int point = random.nextInt(1, amount);if (!points.contains(point)) {points.add(point);}}// 排序Collections.sort(points);for (int i = 0; i < points.size() - 1; i++) {// 计算每个线段的长度-作为所得金额int realPersonAmount = points.get(i + 1) - points.get(i);System.out.println("第" + (i + 1) +"人抢到" +  (realPersonAmount * 1.0 / 100) + "元。");}
}public static void main(String[] args) {RedPacket.devideRedPacket2(10000, 10);
}

剩余金额随机法

算法思想

扣除每个人保底的1分钱,然后剩余的钱进入乐透区,大家开始争抢。

代码

public static void devideRedPacket3(int amount, int memberCount) {ThreadLocalRandom random = ThreadLocalRandom.current();amount -= memberCount;for (int i = 0; i < memberCount; i++) {// 乐透金额int lottoAmount = random.nextInt(0, amount + 1);amount -= lottoAmount;System.out.println("第" + (i + 1) +"人抢到" +  ((lottoAmount + 1) * 1.0 / 100) + "元。");}
}public static void main(String[] args) {RedPacket.devideRedPacket3(10000, 10);
}

简单的算法:红包算法相关推荐

  1. 微信抢红包代码 python_用 Python 实现一个简单的微信红包算法

    今年过年各位一定在微信里抢了不少红包.那么当别人是手气王而你只抢到1分钱的时候,你有没有想过,如果你来实现红包的分配算法,会怎么写? 这里我给一个简单的实现方案. 基本思路就是,有多少个红包,就循环多 ...

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

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

  3. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  4. php 红包算法教程,php仿微信红包分配算法的实现方法

    php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...

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

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

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

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

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

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

  8. golang红包算法

    import ("fmt""math/rand""time" )func main() {//初始10个红包, 10000元钱count, ...

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

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

最新文章

  1. python解释器pypy
  2. Python使用QRCode模块生成二维码
  3. linux内核网络协议栈--接收流程及函数(九)
  4. DWZ+Uploadify +JSON 多文件上传
  5. 如何查看默认root密码?
  6. 信息系统项目管理师论文指导3/3
  7. 递归函数反向显示单链表
  8. ffmpeg 获取帧率_项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)
  9. array_reverse_PHP array_reverse()函数与示例
  10. 清空数据库事务日志_通过事务日志增长加快数据库恢复和长期运行的事务
  11. UVALive 3401 彩色立方体
  12. asp.net电子影像相册_大连孕妈看过来 | 290元=孕中期四维排畸+孕妇写真+胎宝电子影集...
  13. Apk打包-apk的解压和压缩实验
  14. 2017年工作总结--初出茅庐
  15. demo解析 小程序node.js_小程序基于疼讯qcloud的nodejs开发服务器部署
  16. [转]看恐怖片能减肥
  17. Switch可以用string做参数吗
  18. TCAM路由器查表技术分析
  19. 读《嫌疑人X的献身》
  20. 使用调色板绘制系统界面

热门文章

  1. 两行jQuery代码实现头像上传预览
  2. 平方数 (sdut oj)
  3. ppt2pdf 批量
  4. unity_AVProMovieCapture 插件录制屏幕,视频保存
  5. 到底什么是BFC?一篇就够了
  6. Pandas学习总结
  7. 推荐系统的性能评估(RMSE、MAE、F1 core、A/B testing、CTR和CR、ROI和QA)
  8. IDEA启动tomcat程序1099端口被占用解决方案
  9. Vitis项目:基于 ZYNQ 的 IMX2221 摄像头实时视频流采集传输 (一)传感器配置
  10. 关于微信跳一跳辅助脚本的代码学习