基于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 相关文章推荐
Godaddy空间Zend Optimizer升级方法
May 10 PHP
PHP JSON 数据解析代码
May 26 PHP
PHP 解决session死锁的方法
Jun 20 PHP
PHP URL路由类实例
Nov 12 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
php-fpm开启状态统计的方法详解
Jun 23 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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 异常处理实现代码
2009/03/10 PHP
php获取文件大小的方法
2014/02/26 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP中使用curl入门教程
2015/07/02 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
详解javascript高级定时器
2015/12/31 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Python Requests库基本用法示例
2018/08/20 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
什么是事务?为什么需要事务?
2012/01/09 面试题
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
敬老院活动总结
2014/04/28 职场文书
党员目标管理责任书
2014/07/25 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
2014年测量员工作总结
2014/12/12 职场文书
小学工作总结2015
2015/05/04 职场文书
计划生育责任书
2015/05/09 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers