概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量。

微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

算法:

算法很简单,因为微信不会将红包的算法开源,所以,这是基于部分样本提取出的特征以及网上的资源猜测出的算法。

很简单:

基于截尾正态分布,数额随机,额度在0.01和剩余平均值*2之间。

实现上述算法的逻辑主要是:

public staticBigDecimal getRandomMoney(RedPackage redPackage) {//remainSize 剩余的红包数量//remainMoney 剩余的钱

int remainSize =redPackage.getRemainSize();

BigDecimal remainMoney=redPackage.getRemainMoney();if (remainSize == 1) {

remainSize--;

redPackage.setRemainSize(remainSize);

redPackage.setRemainMoney(BigDecimal.ZERO);returnremainMoney;

}

Random r= newRandom();

BigDecimal min= new BigDecimal(0.01);

BigDecimal max= remainMoney.divide(new BigDecimal(remainSize * 2), 2, RoundingMode.HALF_UP);

BigDecimal money= max.multiply(newBigDecimal(r.nextInt()));if (money.compareTo(new BigDecimal(0.01)) < 0) {

money= new BigDecimal(0.01);

}

remainSize--;

remainMoney=remainMoney.subtract(money);

redPackage.setRemainSize(remainSize);

redPackage.setRemainMoney(remainMoney);returnmoney;

}

RedPackage数据结构如下:

public classRedPackage {private intremainSize;privateBigDecimal remainMoney;public intgetRemainSize() {returnremainSize;

}public void setRemainSize(intremainSize) {this.remainSize =remainSize;

}publicBigDecimal getRemainMoney() {returnremainMoney;

}public voidsetRemainMoney(BigDecimal remainMoney) {this.remainMoney =remainMoney;

}

}

测试时初始化相关数据是:

remainSize = 30;

remainMoney= 500;

测试结果

单次测试随机红包

以上面的初始化数据(30人抢500块),执行了两次,结果如下:

//第一次

15.69 21.18 24.11 30.85 0.74 20.85 2.96 13.43 11.12 24.87 1.86 19.62 5.97 29.33 3.05 26.94 18.69 34.47 9.4 29.83 5.17 24.67 17.09 29.96 6.77 5.79 0.34 23.89 40.44 0.92

//第二次

10.44 18.01 17.01 21.07 11.87 4.78 30.14 32.05 16.68 20.34 12.94 27.98 9.31 17.97 12.93 28.75 12.1 12.77 7.54 10.87 4.16 25.36 26.89 5.73 11.59 23.91 17.77 15.85 23.42 9.77

对应图表如下:

第一次:

第二次:

200次:

2000次:

为什么不采用完全随机的办法?

这种产生机理不好的地方在于:大多数人得到的钱非常少,而极少数人得到的钱却非常多,而这可能会对抽取人的积极性产生影响。截尾正态分布能够更好地避免这样的问题,因为更多人的红包大小会聚集在平均值附近,而且由于尾部更快的衰减,因此获得特别大的红包的概率也会相应减小,有助于增加公平性与参与的积极性。尽管具体截尾的范围可能需要获取更多的数据才有可能有一个准确的预测。

微信的金额什么时候算?

微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。

采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

实时性:为什么明明抢到红包,点开后发现没有?

2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。

2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?

随机,额度在0.01和(剩余平均值*2)之间。

例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。

当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。

注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法

这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。

如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

红包的设计

微信从财付通拉取金额数据郭莱,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的裸祭(逻辑)处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。

并发性处理:红包如何计算被抢完?

cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒。

如何保持8w每秒的写入?

多主sharding,水平扩展机器。

占据容量多少?

一个红包只占一条记录,有效期只有几天,因此不需要太多空间。

查询询红包分配,压力大不?

抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力。

一个红包一个队列?

没有队列,一个红包一条数据,数据上有一个计数器字段。

有没有从数据上证明每个红包的概率是不是均等?

不是绝对均等,就是一个简单的拍脑袋算法。

拍脑袋算法,会不会出现两个最佳?

会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。

每领一个红包就更新数据么?

每抢到一个红包,就cas更新剩余金额和红包个数。

红包如何入库入账?

数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。

微信红包随机数字_微信红包的随机算法相关推荐

  1. 微信红包随机数字_微信红包随机算法转载

    php固定红包 + 随机红包算法 1 需求 CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法. 1 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行. 2 随 ...

  2. 微信红包随机数字_微信随机红包数详解和算法代码

    1 需求 写一个固定红包 + 随机红包 固定红包就是每个红包金额一样,有多少个就发多少个固定红包金额就行. 随机红包的需求是.比如红包总金额5元,需要发10个红包.随机范围是 0.01到0.99:5元 ...

  3. 微信链接修改图片_微信链接修改图标

    自定义链接是什么?微信链接修改图片_微信链接修改图标 自定义微信分享链接是指将一条网页链接通过微信接口生成一张卡片,并且该卡片的标题,内容和图片都可以自己编辑.如下图效果 ● 未自定义的网页链接 ● ...

  4. js微信抢红包脚本代码_微信红包算法(js)

    下面实现一个微信红包的抽奖模拟,听说是微信的官方算法,我不确定,先看下实现思路(源码在文章最后): 设置最小金额为0.01,最大金额为剩余金额/剩余红包数量的2倍 在最大最小金额之间取一个随机数作为红 ...

  5. 前端实现红包雨功能_微信隐藏的7个实用功能,你都知道吗?真的白玩这么久微信...

    微信是很多人都在使用的聊天工具,小编使用微信的时间也有五年之久了,那么在这五年期间,小编发现了很多比较实用的功能,今天就挑几个隐藏比较深的分享给大家. 1. 消息定时提醒 不知道你们的忘性是不是和小编 ...

  6. 随机手机号码_微信绑定了手机号码怎么解绑

    新版微信绑定了手机号码怎么解绑,已经没法跟之前一样从正常菜单进行解绑操作了,而且同一手机号重新注册微信需要间隔3个月以上时间.下面就分步骤向大家介绍一下,通过微信安全中心申诉解绑手机号. 微信绑定了手 ...

  7. 微信抢红包的方案_微信抢红包怎样才能抢到最大的告诉你一个方法

    抢红包眼疾手快, 发红包精打细算, 可算起账来为什么还是亏?! 抢到大红包就是好事吗? 元旦节的时候,一个壕同学在群里发了一个大红包,刚洗完脚的我凭借一个唯美的睡姿抢到了最大的一个,50多块. 正当我 ...

  8. 微信抢红包的方案_微信抢红包方法图文详解

    微信抢红包不知道大家是否都熟悉,照顾点新人,很多朋友只是听说微信红包却不知道怎么抢?微信抢红包一夜爆红,受到众多朋友的喜爱,功能上可以实现发红包.查收发记录和提现,一起看看微信抢红包技巧详解吧! 一. ...

  9. 微信抢红包的方案_微信关注抢红包方案

    微信关注抢红包方案 随着经济多元化的发展, 微信走进千家万户, 大多数人都开始关 注微信, 微信红包更是新一代的吸睛必备神器. 为了提升公司的知名 度,扩大公司的外界影响力,公司首次推出了微信抢红包活 ...

最新文章

  1. mysql索引之间的区别
  2. 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
  3. sql server 2005 数据库状态 变成 可疑的解决方案
  4. 前端学习(495):嵌入代码与外部文件和文档模式
  5. djnago 模型 新建对象id为空
  6. VMware中安装deepin虚拟机
  7. static和const
  8. 红旗liuxe5.0下vmware tools安装记录
  9. 利用VBB仿真——实现LCD+数字键盘的密码验证
  10. 【暂时完结】Prescan学习笔记
  11. 案例:仿小米logo过渡渐变效果
  12. matlab ga工具箱编程,遗传算法 -- matlab ga工具箱
  13. 单片机开发之嵌入式基础
  14. zigbee网关 cc2530裸机驱动温度传感器LM75A
  15. java 发送邮件添加附件,Java实现带附件的邮件发送功能
  16. PyTorch scatter_ 从懵懂到清晰
  17. linux+手机+gps,Linux环境下利用GPS+蓝牙实现移动定位
  18. php tcpdf 嵌入字体,TCPDF如何设置中文字体为内嵌字体?
  19. 2017年【计算机视觉机器学习人工智能】领域重要会议 汇总 (持续更新)
  20. python量化自学书籍推荐_量化投资学习推荐的书籍都有哪些?

热门文章

  1. Linux 之二 Linux 多线程
  2. php array_only,php可以定义数组的常量吗
  3. r语言数据变量分段_R数据分析:用R语言做meta分析
  4. python selenium 处理弹窗_python中能否使用selenium获取弹窗的文本内容?
  5. vilatile 深入理解java虚拟机_《深入理解Java虚拟机》笔记 第十二章 volatile变量
  6. 3d建模电脑配置要求_学习3D建模需要什么软件,电脑配置应该如何?新手自学会遇到的问题...
  7. 1xx、101、100 状态详解
  8. 7.6~7.20集训总结(一)
  9. [luogu2148 SDOI2009] ED (博弈论)
  10. MPMoviePlayerController属性方法简介