本文经授权转载自公众号程序员小灰

(ID:chengxuyuanxiaohui)

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


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元

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

//发红包算法,金额参数以分为单位
public static List<Integer> divideRedPackage(Integer totalAmount, Integer totalPeopleNum){    List<Integer> amountList = new ArrayList<Integer>();   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){ List<Integer> amountList = divideRedPackage(5000, 30);   for(Integer amount : amountList){   System.out.println("抢到金额:" + new BigDecimal(amount).divide(new BigDecimal(100))); }
}

程序输出结果如下:

抢到金额: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.如何尽可能降低时间复杂度和空间复杂度。



强烈推荐

『1』基于禁忌搜索算法的智能算法解决一名纯正工科男的疑难杂症

『2』新年总结:2018年,是我妈最快乐的一年

日常推荐

用AI如何打麻将?原来麻将应该这样玩!

今日问题

经常使用回归,你们是否思考过这个?

逻辑回归和线性回归的区别?

打卡格式:打卡第n天,答:xxx

点击下方空白区域查看答案

线性回归要求变量服从正态分布,logistic回归对变量分布没有要求。 线性回归要求因变量是连续性数值变量,而logistic回归要求因变量是分类型变量。线性回归要求自变量和因变量呈线性关系,而logistic回归不要求自变量和因变量呈线性关系

为什么抢红包抢不过别人?学了这个算法就明白了!相关推荐

  1. python-定时给指定微信女朋友发送天气预报和每日一句自动聊天抢红包抢票

    wxpy: 用 Python 玩微信 Python定时自动给微信好友发送天气预报 # -*- coding: utf-8 -*- from __future__ import unicode_lite ...

  2. 别人的【计算机视觉算法岗面经】“吐血”整理:2019秋招面经

    别人的[计算机视觉算法岗面经]"吐血"整理:2019秋招面经 相关链接:[计算机视觉算法岗面经]"吐血"整理:2019秋招资料 //2018/09/28 当初开 ...

  3. 别人的【计算机视觉算法岗面经】“吐血”整理:2019秋招资料

    别人的[计算机视觉算法岗面经]"吐血"整理:2019秋招资料 相关链接:[计算机视觉算法岗面经]"吐血"整理:2019秋招面经 //2018/09/27 兵荒马 ...

  4. php学数据结构,PHP 程序员学数据结构与算法之《栈》

    介绍 "要成高手,必练此功". 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实 ...

  5. 冒泡排序出现的问题_停课不停学 | 有趣的算法——冒泡排序

    停课不停学 有趣的算法--冒泡排序 01 生活中处处都有算法 每个人每天都会用到一些算法,算法也是人类使用计算机解决问题的技巧之一,但是算法并不是仅仅用于计算机领域中,包括在数学.物理甚至是每天的生活 ...

  6. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  7. 粗题⼈不考你没学过的算法

    Description 粗题⼈症重承诺此题不考你没学过的算法 给你⼀个区间[L,R] 需要选择N个数,这N个数都在这个区间范围内 那么我们知道⼀共有[R-L+1]^N种选法 假如我们想要这N个数的最⼤ ...

  8. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法 (白宁超   2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类 ...

  9. diff算法阮一峰_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法

    前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...

最新文章

  1. 神经网络-全连接层(1)
  2. Consul入门04 - Consul集群
  3. 全球及中国氮肥产业营销趋势与十四五消费规模研究报告2022版
  4. 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件
  5. Advanced techniques: creating sound, sequencing, timing, scheduling
  6. 如何将静态网页部署到github上
  7. PL/SQL(一)简介
  8. nuke软件功能有哪些?苹果Mac影视后期特效合成软件NUKE 13
  9. iOS软件开发揭密:iPhoneiPad企业应用和游戏开发(china-pub首发)
  10. 一文看懂3D封装技术
  11. 奔图打印linux驱动下载,奔图P3405D打印机驱动下载
  12. ios 根据日期知道周几_iOS 计算指定日期是周几星期几
  13. 一文读懂寒武纪:AI芯片拓荒者的乘风破浪
  14. java图片编辑器,Java图片编辑工具thumbnailator
  15. 在微信开发者工具中,使用WeUI前端美化框架,微信小程序
  16. “三色河内塔”算法(三色汉诺塔)
  17. elastic官网文档翻译来.1
  18. HEVC码率控制TEncRCPic
  19. Windows ❀ CMD中使用批量Ping网段命令教程
  20. MEM 英语备考第一篇

热门文章

  1. 【Python】Scrapy爬虫实战(传智播客老师简介)
  2. 从神经元谈到深度神经网络
  3. 湘苗培优 | 从入门到精通
  4. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选
  5. 免费!这里有一份开发者进阶“宝典”求带走
  6. 有了它,AI甚至可以让你知道对方是否真的爱你?
  7. Google用更少标签生成图像,还提出一个用于训练评估GAN的库
  8. 近万个Python开源项目中精选Top34!
  9. 精选180+Python开源项目,随你选!做项目何愁没代码
  10. 机器学习大神迈克尔 · 乔丹:我讨厌将机器学习称为AI