基于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的中问验证码
Nov 25 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
Yii rules常用规则示例
Mar 15 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
Yii2框架实现数据库常用操作总结
Feb 08 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
joomla数据库操作示例代码
2016/01/06 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
vue组件横向树实现代码
2018/08/02 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
理财投资建议书
2014/03/12 职场文书
家长写给孩子的评语
2014/04/18 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
工作失职检讨书500字
2014/10/17 职场文书
招标保密承诺书
2015/01/20 职场文书
毕业论文致谢词
2015/05/14 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
公司开业主持词
2015/07/02 职场文书