前言

面试,或者社会,网络,甚至电视上都会谈到的一个问题,
关于微信红包是否每个人都概率一样的问题,
于是在数学上做了一个证明,并写了个程序验算了公式

提出想法

脑子里第一个想法就是:m1 = rand(0.01, m - 0.01*n),其中:

rand: 随机函数
m1: 抢到的金额
m: 当前钱包剩余金额
n: 当前还未抢红包的人数

意思就是,每次抢到的钱包金额是保证剩余的人至少能抢包1分钱之后,剩余的金额随机抢一个金额,
相信大多数人的第一反应就是这一个意思,这样是对的吗?

数学来了

从数学角度可以证明,这样是不平均的,证明如下:

定义M为总金额,
第一次抢红包的金额为, m1 = [0.01, M), 平均金额金额为 m1 = M/2
第二次抢红包的金额为,m = M - m1, m2 = [0.01, m), 平均金额为 m2 = (M - m1) / 2 = M/4
同理,
第三次抢红包的金额为,m = M - m1 - m2, m3 = [0.01, m),平均金额为 m3 = (M - m1 - m2) / 2 = M/8
...
第n次平均金额为 mn = (M - m1 - m2 - ... - mn-1) / 2由上易得:
m1 = M/2 > m2 = M/4,
m2 = M/4 > m3 = M/8
...也可以得 m = M/(2^n),
当n增大时,m减小。可知m是关于n一个单调递减函数。

得出结论,先抢到的期望大于后面的期望值,抢到的红包金额不平均,由此特地写一个程序证明:
100块钱,10个红包,循环了10000次,平均值如下:

上面图标金额单位是分,总额为9995分,丢的5分是因为每次的金额除以10000时,整数丢精度了,没处理,但是所有抢到的总金额是正确的。这个不影响结论,所以忽略误差的5分钱。

可以明显看到测试后的数据满足公式推论,上一次是下一次的2倍。但是最后的几次不满足。原因是因为红包最后一次有一个pick all的操作,即是第10个人,不管剩余多少,都全部是第10个人的。

正确的算法来了

根据参考文章提到的红包算法公式:m1 = rand(0.01, (m/n)*2), 其中,

rand: 随机函数
m1: 抢到的金额
m: 当前钱包剩余金额
n: 当前还未抢红包的人数

简单证明:

第一次抢红包的平均金额是 m1 = M/n,
第二次抢红包的平均金额是 m2 = M/n,
第三次抢红包的平均金额是 m3 = M/n,
...
第n次抢红包的平均金额是 mn = M/n,即:
无论第几次抢红包,抢到的红包的平均值都是M/n.
这才使得红包分部均匀,先抢还是后抢都是一样的期望值。

这个没有写程序了,在该文章中有程序证明:

参考文章:

  1. https://www.zybuluo.com/yulin718/note/93148
  2. https://cloud.tencent.com/developer/article/1699931
  3. https://www.zhihu.com/question/22625187

微信红包算法概率比较相关推荐

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

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

  2. matlab 发微信,微信红包算法MATLAB实现

    上午看到基友分享的微信红包算法的文章,代码很短,春节期间红包太火了,看完就也想实现下玩玩,原代码是JAVA的,没接触过JAVA,所以看懂后改成了MATLAB的.原文链接:微信红包随机算法初探 , 作者 ...

  3. matlab程序模拟微信抢红包,微信红包算法MATLAB实现

    上午看到基友分享的微信红包算法的文章,代码很短,春节期间红包太火了,看完就也想实现下玩玩,原代码是JAVA的,没接触过JAVA,所以看懂后改成了MATLAB的.原文链接:微信红包随机算法初探 , 作者 ...

  4. 微信红包算法代码实现

    微信红包算法思考学习研究 闲来无事,研究下微信的红包算法,也思考下可以实现的其他算法,略作记录. 微信红包的随机算法不是在发红包时就算好的,而是用户在领取红包时实时计算出客户领取红包金额,因此红包的算 ...

  5. js 实现微信红包算法

    微信红包算法 5块钱生成五个红包,要注意的有 1.生成5个随机数 2.5个随机数加起来必须等于5 3.红包要设置最小值 如最小值不能小于0.01 4.红包要设置最大值,如果第一个红包为5,剩下四个红包 ...

  6. 说说微信红包算法,为什么你总是抢的那么少?

    红包业务流程 拆包算法 1.无脑随机发  每个人抢红包,红包金额 = [0.01,红包剩余金额):最后一个人就不用随机了,无论剩下多少都是最后一个人的了. 2.线性切割法 把总金额数值,想象成一条绳子 ...

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

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

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

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

  9. Python微信红包算法

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

最新文章

  1. java IO流文件的读写具体实例
  2. php gd库画线,[PHP] GD库(十)绘制线段与圆弧 imageline、imagesetstyle 与 imagearc 函数...
  3. C++统计难题hdu1251
  4. RuntimeError: ‘cryptography‘ package is required for sha256_password or caching_sha2_password auth m
  5. Python 位操作运算符
  6. 数据结构之最小生成树
  7. Xcode 9中去除Block警告
  8. DeepMind为明年的AAAI,准备了一份各种DQN的混血
  9. primefaces教程_Primefaces,带有JPA的Spring 4(Hibernate 4 / EclipseLink)示例教程
  10. 向量化计算cell_Matlab向量化编程在二级劝退学科中的一个应用例子
  11. 图像分割评估指标——表面距离计算库
  12. SECURITY:补丁
  13. cisco设备上查SFP模块sn
  14. pat计算机程序考试考试时间,pat报名条件
  15. 标准时间格式与时间戳的转化
  16. 协议大全 http协议 http://www.chinaitpower.com/Net/xieyi/HTTP/index.html
  17. 回溯算法(持续更新)
  18. 连英文都不懂怎么学python_不懂英文能学Python吗?
  19. 关于华为云短信接口对接问题
  20. 如果使用PostGIS的ST_Area函数计算多边形面积

热门文章

  1. Spring事务剖析-TransactionManager
  2. Spring多数据源TransactionManager冲突解决方案
  3. FXCM福汇外汇 fx-aisa.com「连续走势」与「反转走势
  4. latex教程: 1.1-历史
  5. AWS EFS 吞吐量利用率Throughput utilization (%)达到100%触发报警原因分析
  6. 激光切管机可以运用到什么行业?
  7. LeetCode 297. 二叉树的序列化与反序列化
  8. 双纽线通过matlab绘图输出xy坐标,Matlab 6 (Advanced_Plotting)
  9. 小型功率放大器的设计与制作——功率放大器电路总结
  10. linux 应用层gpio中断_linux gpio中断