基于PHP微信红包的算法探讨


Posted in PHP onJuly 21, 2016

突发奇想给校友微信群发了红包,我设定红包总额为10元,支持28个人随机领取。
于是一个有趣的结果出现了:
A 领取了 0.26元
B 领取了 0.29元
C 领取了 0.02元
D 领取了 0.56元
E 领取了 0.64元
……
微信是采用什么样的算法做到的?简单百度了下,目前尚未有官方的说明,仅仅在知乎里有一个较为热门的讨论,链接戳这里,不过他们讨论的太过于深入,有掉坑之嫌。
我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求:
1、每个人都要能够领取到红包;
2、每个人领取到的红包金额总和=总金额;
3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;
4、算法一定要简单,不然对不起腾讯这个招牌;
正式编码之前,先搭建一个递进的模型来分析规律
设定总金额为10元,有N个人随机领取:

N=1
则红包金额=X元;

N=2
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数
第二个红包=10-第一个红包金额;

N=3
红包1=0.01至0.98之间的某个随机数
红包2=0.01至(10-红包1-0.01)的某个随机数
红包3=10-红包1-红包2

…… 
至此,规律出现啦!开始编码!
Php代码

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 
$total=10;//红包总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
 
for ($i=1;$i<$num;$i++) 
{ 
 $safe_total=$total-($num-$i)*$min;//随机安全上限 
 $money=mt_rand($min*100,$safe_total*100)/100; 
 $total=$total-$money; 
 echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; 
} 
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输入一看,波动太大,这数据太无趣了!
第1个红包:7.48 元,余额:2.52 元
第2个红包:1.9 元,余额:0.62 元
第3个红包:0.49 元,余额:0.13 元
第4个红包:0.04 元,余额:0.09 元
第5个红包:0.03 元,余额:0.06 元
第6个红包:0.03 元,余额:0.03 元
第7个红包:0.01 元,余额:0.02 元
第8个红包:0.02 元,余额:0 元 

改良一下,将平均值作为随机安全上限来控制波动差
Php代码

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 
$total=10;//红包总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
 
for ($i=1;$i<$num;$i++) 
{ 
 $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 
 $money=mt_rand($min*100,$safe_total*100)/100; 
 $total=$total-$money; 
 echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; 
} 
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输出结果见下图
第1个红包:0.06 元,余额:9.94 元
第2个红包:1.55 元,余额:8.39 元
第3个红包:0.25 元,余额:8.14 元
第4个红包:0.98 元,余额:7.16 元
第5个红包:1.88 元,余额:5.28 元
第6个红包:1.92 元,余额:3.36 元
第7个红包:2.98 元,余额:0.38 元
第8个红包:0.38 元,余额:0 元

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP+ajax 无刷新删除数据
Feb 20 PHP
PHP新手NOTICE错误常见解决方法
Dec 07 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
php实现的RSS生成类实例
Apr 23 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 #PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 #PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 #PHP
PHP获取当前文件的父目录方法汇总
Jul 21 #PHP
功能强大的php分页函数
Jul 20 #PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 #PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 #PHP
You might like
php whois查询API制作方法
2011/06/23 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
Symfony生成二维码的方法
2016/02/04 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
jQuery 名称冲突的解决方法
2011/04/08 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python切片知识解析
2016/03/06 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python找出最小的K个数实例代码
2018/01/04 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
python实现逻辑回归的示例
2020/10/09 Python
Python timeit模块原理及使用方法
2020/10/10 Python
python如何调用php文件中的函数详解
2020/12/29 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
硕士研究生自我鉴定范文
2013/12/27 职场文书
接受捐赠答谢词
2014/01/27 职场文书
会计演讲稿范文
2014/05/23 职场文书
作风大整顿心得体会
2014/09/10 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python