基于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 相关文章推荐
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
Jun 29 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
May 07 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
Yii多表联合查询操作详解
Jun 02 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
phpstorm激活码2020附使用详细教程
Sep 25 PHP
详细分析PHP7与PHP5区别
Jun 26 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
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
javascript 继承实现方法
2009/08/26 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
详解Python 协程的详细用法使用和例子
2018/06/15 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python+OpenCV实现图像拼接
2020/03/05 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
机工车间主任岗位职责
2014/03/05 职场文书
促销活动总结范文
2014/04/30 职场文书
校园环保标语
2014/06/13 职场文书
村安全生产责任书
2014/08/25 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
营销计划书
2015/01/17 职场文书
环卫个人总结
2015/03/03 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
法制工作总结2015
2015/07/23 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技