基于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 insert语法详解
Jun 07 PHP
php 中文和编码判断代码
May 16 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
一个简单的PHP验证码实现代码
May 10 PHP
php版微信自定义回复功能示例
Dec 05 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
PHP join()函数用法与实例讲解
Mar 11 PHP
PHP中类与对象功能、用法实例解读
Mar 27 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
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
php格式化时间戳
2016/12/17 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python获取文件ssdeep值的方法
2014/10/05 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
Python实现随机爬山算法
2021/01/29 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
软件测试题目
2013/02/27 面试题
电脑教师的自我评价
2013/12/18 职场文书
迟到检讨书900字
2014/01/14 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
2014年团委工作总结
2014/11/13 职场文书
碧霞祠导游词
2015/02/09 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL