对抢红包,大家肯定不陌生,但是,有想过抢红包是如何实现的嘛?今天就来讨论下抢红包的几种实现。

首先,我们得明确一下需求和需求的限制条件。红包主要有三点限制

  1. 抢到的总额 = 红包的总额,不能多也不能少了
  2. 最小值是0.01元,即每个人都有份
  3. 每个人抢到的红包金额,尽量平均

假设红包总金额是M元,抢红包的人数是N人

随机法1.0

随机法1.0–无脑随机法,是每个人抢红包,红包金额 = (1,红包剩余金额);最后一个人就不用随机了,无论剩下多少都是最后一个人的了。这种方法,优点是实现简单,但是,先抢的人会很赚,抢到大红包的概率很高,后面的人就比较吃亏了,甚至最后的人都没红包可抢

随机法2.0

随机法2.0–随机结果比例法(名字取的有点随意,没想到更形象生动的 -_-),是借鉴了上面说的 ”无脑随机法“,但是比较巧妙的避免了后面的人抢的少甚至抢不到的情况。思路是:每个人都随机,随机的范围是(0,M),然后把所有人的随机金额加起来得到random_total_money,把总金额M除以random_total_money,得到每个人的比例,然后把每个人的比例除以M。

举个例子:总金额是100元,抢红包人数是10人,随机范围是(1,M),假设10次随机的结果是200元,那100/200=0.5,那每个人实际抢到的红包金额=随机金额*0.5

但是,这个算法,有两个缺点:

  1. 对最小值的考虑不全面,如果比例值是0.5,而又有人随机随到了最小值0.01,那就违背了最开始所说的“限制2”

  2. 对无限循环小数考虑不全,如果算出的比例是1/3=0.333333…,那就得额外考虑

二倍均值法

假设总金额是M元,N个人,每次抢的金额=(0, (M/N) *2),比如,还是之前说的条件,金额100,人数10,

第一个人抢的金额是 (0,20),抢到的数值,根据正态分布,应该是10左右,远低于10的概率很小,同样远大于10的概率和很小,这里假设第一个人抢到的数值是10;

第二个人抢的金额是(0,90/9 *2)=(0,20),同第一个人,第二个人红包金额也应该是10附近;

剩下的人,以此类推。

查阅了“微信红包的架构设计”,里面就是使用的这个方法。但是,这个算法,也不是完美的,假如第一个人抢到15,第二个人的范围是(0,18.89),假如第二个人又抢到很高,那对后面的人是不利的

另外,还看到了一种叫“线性切割法”的算法,这个算法的思想是:把总金额数值,想象成一条绳子,对绳子切割N-1刀(N就是人的数量),每个人抢到的红包金额就是切割的绳子的占比,但是,这方法也不能避免“无限循环小数”问题;并且,对每个人抢到的金额尽量平均,该如何保证呢?需要考虑的点很多,时间复杂度、空间复杂度都比较高

抢红包算法 随机法和二倍均值法相关推荐

  1. java模拟微信抢红包金额算法规则二倍均值法模拟(满满的注释)

    二倍均值法模拟微信抢红包金额算法规则 ```java /*** 二倍均值法* @param amount 总金额* @param min 最小金额* @param num 个数* 本帖只提供思路,实际 ...

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

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

  3. 使用二倍均值法模拟抢红包

    文章目录 场景分析 二倍均值法实现 Java版 JavaScript版 场景分析 微信群发一个红包,金额10元,共10个人抢. 有多种方案: 按先来后到,对每个人: 在[0, 当前剩余金额]区间内生成 ...

  4. 最全微信红包分配算法,不只是二倍均值那么简单

    最全微信红包分配算法!不只是二倍均值那么简单! 一.序言 本文要解决什么问题? 抢红包的顺序对红包收益有无影响? 抢红包的顺序对当运气王的概率有无影响? 红包接龙游戏每次都是先抢好还是后抢好? 红包接 ...

  5. 看完微信抢红包算法你就明白,为啥你不是手气最佳

    本文分享自华为云社区<为啥春节抢红包总不是手气最佳?看完微信抢红包算法你就明白了!>,作者: XiaoLin_Java. 前言 春节必不可少的活动就是抢红包啦,从以前的纸质红包到现在互联网 ...

  6. 微信抢红包算法实现(JAVA)

    简介 网上说的有两种比较公平的算法,一种是二倍均值法,一种是线段切割法.下面我们介绍下两种算法的实现: 二倍均值法 原理 剩余红包金额M,剩余人数N,那么:每次抢到金额=随机(0,M/N*2) 保证了 ...

  7. 二倍均值随机算法之抢拼手气红包场景应用

    拼手气类的游戏,更能激发用户购物和社交的趣味性,以及游戏竞争心理,拼手气类的活动甚至可以影响人们消费心理. 拼手气红包就是最简单的例子,哪怕你手气红包只有0.01元,在众多竞争者中脱颖而出,抢到的那一 ...

  8. 实现抢红包算法?如此简单

    发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 1.所有人抢到金额之和等于红包金额,不能超过,也不能少于. 2.每个人至少抢到一分钱. 3.要保证所有人抢到金额的几率相等. 小灰的思路是什 ...

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

    发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 1.所有人抢到金额之和等于红包金额,不能超过,也不能少于. 2.每个人至少抢到一分钱. 3.要保证所有人抢到金额的几率相等. 小灰的思路是什 ...

最新文章

  1. 作业三--简单四则运算
  2. java第七章多线程_第七章 多线程
  3. 初学者适用的最新Java学习路线
  4. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...
  5. 刷题总结——xor(ssoj)
  6. html表格怎么设置浮动,html – 表格布局和浮动左和引导网格
  7. 流程图怎么切换_PPT中「较长的流程图」该如何清晰展现?
  8. golang 关闭gc 并手动gc_Golang 防内存泄漏编码原则
  9. word插入visio图显示不完全
  10. 如何高效地远程部署?Fabric 来支招!
  11. 【angularjs】【学习心得】路由继续研究篇
  12. vue中:key 和react 中key={} 的作用,以及ref的特性?
  13. 记录一次:微信支付申请时,网站不通过/统一驳回的问题解决方法
  14. Java web学生信息管理系统(jsp)
  15. 使用mimics重建CT图像
  16. Simulink建模与仿真
  17. 山西内蒙古地区知名的调查研究咨询公司
  18. mysql hash索引 btree索引_HASH索引做等值查询会很快,BTree索引做范围查询比较快...
  19. wan端口未连接怎么弄_路由器wan口网线未连接(wan口未插网线)的解决方法
  20. Java 生成随机码工具类 线程安全 两种方式

热门文章

  1. 达人评测 rtx3080和GTX1650选哪个好
  2. Mac Touch Bar无法调节音量和亮度的解决方法
  3. Uboot启动流程分析:启动阶段1 Start.S
  4. .as_matrix()的作用
  5. mac安装pip命令
  6. 笔记:linux-c Zxing-cpp解析图片中的二维码
  7. JAVA-IO流笔记整理----(2)字节流输入输出
  8. 短视频APP开发,消除需求壁垒后的圈层经济
  9. 华为鸿蒙系统不能用于手机,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  10. 看过后看你还有没有勇气玩成语接龙了