漫画:如何实现抢红包算法?

二倍均值随机算法之抢拼手气红包场景应用 两种生成红包的方式对比拼手气红包有两种计算方法,一种是预计算,一种是实时算。预计算在生成拼手气红包的时候,会提前根据总金额M和红包人数N,生成每个红包的金额,在抢红包的过程中,只需要从金额列表中取出,直至取完。这种方式需要占用额外的存储空间并且增加额外的I/O,在高并发场景下并不是最优的解决方案。实时算采用的是纯内存计算,不需要预算空间存储,实时性很高。 阅读详情

 

 

 

 

 

 

 

 

 

 

发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则?

 

1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。

 

2.每个人至少抢到一分钱。

 

3.要保证所有人抢到金额的几率相等。

 

 

 

 

 

小灰的思路是什么样呢?

 

每次抢到的金额 = 随机区间 ( 0,  剩余金额 )

 

 

 

 

为什么这么说呢?让我们看一个栗子:

 

假设有10个人,红包总额100元。

 

第一个人的随机范围是(0,100元),平均可以抢到50元。

 

假设第一个人随机到50元,那么剩余金额是100-50 = 50 元。

 

第二个人的随机范围是 (0, 50元),平均可以抢到25元。

 

假设第二个人随机到25元,那么剩余金额是50-25 = 25 元。

 

第三个人的随机范围是 (0, 25元),平均可以抢到12.5元。

 

以此类推,每一次随机范围越来越小。

 

 

 

 

 

 

 

方法1:二倍均值法

 

剩余红包金额为M,剩余人数为N,那么有如下公式:

 

每次抢到的金额 = 随机区间 (0, M / N X 2)

 

这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。

 

举个栗子:

 

假设有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元。

 

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


 

 

 


 
  1. //发红包算法,金额参数以分为单位

  2. public static List<Integer> divideRedPackage(Integer totalAmount, Integer totalPeopleNum){

  3.    List<Integer> amountList = new ArrayList<Integer>();

  4.    Integer restAmount = totalAmount;

  5.    Integer restPeopleNum = totalPeopleNum;

  6.    Random random = new Random();

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

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

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

  10.        restAmount -= amount;

  11.        restPeopleNum --;

  12.        amountList.add(amount);

  13.    }

  14.    amountList.add(restAmount);

  15.    return amountList;

  16. }

  17.  

  18. public static void main(String[] args){

  19.    List<Integer> amountList = divideRedPackage(5000, 30);

  20.    for(Integer amount : amountList){

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

  22.    }

  23. }

 

程序输出结果如下:

抢到金额:2.92

抢到金额:1.48

抢到金额:3.05

抢到金额:0.53

抢到金额:0.45

抢到金额:1.36

抢到金额:1.02

抢到金额:1.99

抢到金额:1.3

抢到金额:0.48

抢到金额:0.83

抢到金额:2.89

抢到金额:0.94

抢到金额:2.11

抢到金额:3.13

抢到金额:0.91

抢到金额:2.64

抢到金额:2.02

抢到金额:2.88

抢到金额:1.13

抢到金额:2.09

抢到金额:1.37

抢到金额:2.41

抢到金额:2.13

抢到金额:1.32

抢到金额:0.44

抢到金额:1.62

抢到金额:1.89

抢到金额:2.23

抢到金额:0.44

 

 

 

 

 

 

 

 

 

方法2:线段切割法

 

何谓线段切割法?我们可以把红包总金额想象成一条很长的线段,而每个人抢到的金额,则是这条主线段所拆分出的若干子线段。

 

 

 

 

 

如何确定每一条子线段的长度呢?由“切割点”来决定。当N个人一起抢红包的时候,就需要确定N-1个切割点。

 

因此,当N个人一起抢总金额为M的红包时,我们需要做N-1次随机运算,以此确定N-1个切割点。随机的范围区间是(1, M)。

 

当所有切割点确定以后,子线段的长度也随之确定。这样每个人来抢红包的时候,只需要顺次领取与子线段长度等价的红包金额即可。

 

这就是线段切割法的思路。在这里需要注意以下两点:

 

1.当随机切割点出现重复,如何处理。

2.如何尽可能降低时间复杂度和空间复杂度。

 

 

 

 

 

 

 

 

—————END—————

红包算法(二倍均值法,线段切割发) NULL 博文链接:https://lovewen-2004.iteye.com/blog/2419999 立即下载

相关推荐

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2562

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

使用二倍均值法进行的拼手气红包算法 假设M为总金额,N为抢红包人数,那么根据二倍均值法,每次抢到的金额 = 随机区间 (0, M / N X 2) 这个公式可以确保每个人获取的金额的平均值是相等的,不会受到先后顺序不同的影响。 比如说,有一个金额为100块的红包,10人分,那么: 100/10X2 = 20, 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。 假设第一个人随机到10元,那么剩余金额是100-10 = 90 元。 90/9X2 = 20, 所以第二个人的随机范围同样是(0,20 )

一个嵌入式软件工程师的博客 3838

微机原理与接口技术第六版周荷琴课后习题答案及解析(期末重点)

第二章 1.8086/8088CPU可直接寻址多少个内存(字节)单元?多少个I/O端口?它们的外部数据总线各有多少根? 8086/8088CPU使用的是20位地址总线,因此可以直接寻址2的20次方个内存单元(即1,048,576),每个单元大小为1字节,因此可以直接寻址2的20次方个字节的内存。 8086/8088CPU有64K个I/O端口,每个端口占用1字节的地址空间,因此可以直接寻址6...

Wmicheng的博客 1万+

算法——二倍随机法

使用java语言讲解并实现了《算法——二倍随机法》。

qq_61350148的博客 1984

RuoYi项目适配达梦数据库(二)

RuoYi项目,代码生成模块的达梦数据库适配。

邢慧鹏的博客 1万+

实战分享:如何利用svchost进程绕过360防护(附完整Shellcode注入教程)

本文深入解析系统进程安全防护机制,探讨svchost等关键进程的安全特性与防护策略。详细分析安全软件的行为检测和内存保护技术,提供系统加固与监控实践建议,助力企业构建多层次防御体系,有效应对潜在安全威胁。

weixin_30752699的博客 99

二倍均值算法实现公平抢红包

假设剩余红包金额为m元,剩余人数为n,那么有如下公式。 每次抢到的金额 = 随机区间 [0.01,m /n × 2 - 0.01]元 这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺 序而造成不公平。 举个例子如下。 假设有5个人,红包总额100元。 100÷5×2 = 40,所以第1个人抢到的金额随机范围是[0.01,39.99]元,在正常 情况下,平均可以抢到20元。 假设第1个人随机抢到了20元,那么剩余金额是80元。 80÷4×2 = 40,所以第2个人抢到的...

a116385895的博客 1957

GNSS接收机性能测试全攻略:从实验室到真实场景

本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。

weixin_28365523的博客 510

红包算法-二倍均值法

今天看到个有意思的题目,赶快来记录下来 就是说 100块钱随机发红包,怎样才能公平 假设剩余红包金额m元,剩余人数n人。那么有如下公式 每次抢到的金额=随机区间[0.01,m/n2-0.01]元 举个例子 100/52=40元。 所以第一个人抢到的金额范围在0.01-39.99元。 第二个人 80/4*2 所以第二个人抢到的金额范围在0.01-39.99元 所以,每个人抢到的范围均值是相等的 ...

积木 5172

Linux云服务器上搭建《僵尸毁灭工程》私服全流程指南(避坑版)

本文详细介绍了在Linux云服务器上搭建《僵尸毁灭工程》私服的全流程指南,包括环境准备、SteamCMD安装、游戏服务器部署、内存优化配置及高级调优技巧。特别针对常见问题提供解决方案,帮助玩家快速搭建稳定的私服环境。

solidity8miner的博客 599

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 234

实现线段切割法_漫画:如何实现抢红包算法?

发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则?1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。2.每个人至少抢到一分钱。3.要保证所有人抢到金额的几率相等。小灰的思路是什么样呢?每次抢到的金额 = 随机区间 ( 0, 剩余金额 )为什么这么说呢?让我们看一个栗子:假设有10个人,红包总额100元。第一个人的随机范围是(0,100元),平均可以抢到50元。假设第一个人随机到50...

weixin_39560029的博客 292

【实战】基于 Inner-IoU 的 YOLOv8 优化指南:显著提升检测精度

Inner-IoU 凭借辅助边框的创新设计,成功解决了传统 IoU 损失在小目标、遮挡场景下的收敛难题,为 YOLOv8 注入了更强的定位能力。从原理剖析到代码集成,本教程已为你铺就了一条“精度提升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“精度优异”的答卷——相信我,当你看到检测框精准贴合目标的那一刻,你会明白这份尝试的价值。

m0_64661770的博客 106

过年之抢红包算法

前言 昨天是大年初一,怎么说呢,因为在读大学, 没有出来工作,所以昨晚也是陆陆续续有收到一些红包。然后想起自己对算法感兴趣,以前也看过一些公众号有讲过抢红包算法,今天就更新一遍关于抢红包的算法,对学过数据结构或者对抢红包感兴趣的可以看一看。本文就讲两个抢红包算法。 PS:关于抢红包算法我是参看公众号“程序员小灰”。这个公众号是引领我学数据结构的公众号,通过漫画的形式讲得很通俗易懂。 抢红包算...

god-jiang的博客 2046

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

抢红包算法

时间:2020-08-12 17:18:19抢红包大家都知道,但发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则?所有人抢到金额之和等于红包金额,不能超过,也不能少于。每个人至少抢到一分钱。要保证所有人抢到金额的几率相等。。

springdk2009的博客 646

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

漫画算法系列

漫画算法:什么是红黑树? 漫画算法:5分钟搞明白红黑树到底是什么?_zandaoguang的博客-优快云博客 漫画:什么是架构师? 漫画:什么是架构师?_程序员小灰的博客-优快云博客_架构师 漫画:什么是八皇后问题? 漫画:什么是八皇后问题?_程序员小灰的博客-优快云博客 漫画:程序员的最强大脑 漫画:程序员的最强大脑_程序员小灰的博客-优快云博客 漫画:什么是蓝绿部署? 漫画:什么是蓝绿部署?_程序员小灰的博客-优快云博客_蓝绿部署 漫画:什么是字典序

青少年趣味编程 1678

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 漫画:什么是字典序算法?
下一篇: 漫画:什么是二叉堆?
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值