微信红包算法概率比较
前言
面试,或者社会,网络,甚至电视上都会谈到的一个问题,
关于微信红包是否每个人都概率一样的问题,
于是在数学上做了一个证明,并写了个程序验算了公式
提出想法
脑子里第一个想法就是: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.
这才使得红包分部均匀,先抢还是后抢都是一样的期望值。
这个没有写程序了,在该文章中有程序证明:
参考文章:
- https://www.zybuluo.com/yulin718/note/93148
- https://cloud.tencent.com/developer/article/1699931
- https://www.zhihu.com/question/22625187
微信红包算法概率比较相关推荐
- 一不小心错过的几个亿还可以再回来!解密微信红包算法
前言 ◆ ◆ ◆ ◆ 还记得2017年,微信红包收发总量达到460亿个,2019年,除夕到初五,8.23亿人收发微信红包.一觉醒来,微信群里各种红包,顿时觉得错过了几个亿,破解了红包的规律,是不是就可 ...
- matlab 发微信,微信红包算法MATLAB实现
上午看到基友分享的微信红包算法的文章,代码很短,春节期间红包太火了,看完就也想实现下玩玩,原代码是JAVA的,没接触过JAVA,所以看懂后改成了MATLAB的.原文链接:微信红包随机算法初探 , 作者 ...
- matlab程序模拟微信抢红包,微信红包算法MATLAB实现
上午看到基友分享的微信红包算法的文章,代码很短,春节期间红包太火了,看完就也想实现下玩玩,原代码是JAVA的,没接触过JAVA,所以看懂后改成了MATLAB的.原文链接:微信红包随机算法初探 , 作者 ...
- 微信红包算法代码实现
微信红包算法思考学习研究 闲来无事,研究下微信的红包算法,也思考下可以实现的其他算法,略作记录. 微信红包的随机算法不是在发红包时就算好的,而是用户在领取红包时实时计算出客户领取红包金额,因此红包的算 ...
- js 实现微信红包算法
微信红包算法 5块钱生成五个红包,要注意的有 1.生成5个随机数 2.5个随机数加起来必须等于5 3.红包要设置最小值 如最小值不能小于0.01 4.红包要设置最大值,如果第一个红包为5,剩下四个红包 ...
- 说说微信红包算法,为什么你总是抢的那么少?
红包业务流程 拆包算法 1.无脑随机发 每个人抢红包,红包金额 = [0.01,红包剩余金额):最后一个人就不用随机了,无论剩下多少都是最后一个人的了. 2.线性切割法 把总金额数值,想象成一条绳子 ...
- js微信抢红包脚本代码_微信红包算法(js)
下面实现一个微信红包的抽奖模拟,听说是微信的官方算法,我不确定,先看下实现思路(源码在文章最后): 设置最小金额为0.01,最大金额为剩余金额/剩余红包数量的2倍 在最大最小金额之间取一个随机数作为红 ...
- 微信抢红包代码 python_用 Python 实现一个简单的微信红包算法
今年过年各位一定在微信里抢了不少红包.那么当别人是手气王而你只抢到1分钱的时候,你有没有想过,如果你来实现红包的分配算法,会怎么写? 这里我给一个简单的实现方案. 基本思路就是,有多少个红包,就循环多 ...
- Python微信红包算法
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
最新文章
- java IO流文件的读写具体实例
- php gd库画线,[PHP] GD库(十)绘制线段与圆弧 imageline、imagesetstyle 与 imagearc 函数...
- C++统计难题hdu1251
- RuntimeError: ‘cryptography‘ package is required for sha256_password or caching_sha2_password auth m
- Python 位操作运算符
- 数据结构之最小生成树
- Xcode 9中去除Block警告
- DeepMind为明年的AAAI,准备了一份各种DQN的混血
- primefaces教程_Primefaces,带有JPA的Spring 4(Hibernate 4 / EclipseLink)示例教程
- 向量化计算cell_Matlab向量化编程在二级劝退学科中的一个应用例子
- 图像分割评估指标——表面距离计算库
- SECURITY:补丁
- cisco设备上查SFP模块sn
- pat计算机程序考试考试时间,pat报名条件
- 标准时间格式与时间戳的转化
- 协议大全 http协议 http://www.chinaitpower.com/Net/xieyi/HTTP/index.html
- 回溯算法(持续更新)
- 连英文都不懂怎么学python_不懂英文能学Python吗?
- 关于华为云短信接口对接问题
- 如果使用PostGIS的ST_Area函数计算多边形面积
热门文章
- Spring事务剖析-TransactionManager
- Spring多数据源TransactionManager冲突解决方案
- FXCM福汇外汇 fx-aisa.com「连续走势」与「反转走势
- latex教程: 1.1-历史
- AWS EFS 吞吐量利用率Throughput utilization (%)达到100%触发报警原因分析
- 激光切管机可以运用到什么行业?
- LeetCode 297. 二叉树的序列化与反序列化
- 双纽线通过matlab绘图输出xy坐标,Matlab 6 (Advanced_Plotting)
- 小型功率放大器的设计与制作——功率放大器电路总结
- linux 应用层gpio中断_linux gpio中断