基于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 相关文章推荐
mysql建立外键
Nov 25 PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
php cli配置文件问题分析
Oct 15 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 PHP
PHP大文件及断点续传下载实现代码
Aug 18 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
一个多文件上传的例子(原创)
2006/10/09 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
python类和函数中使用静态变量的方法
2015/05/09 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python识别验证码图片实例详解
2020/02/17 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
幼儿园义卖活动方案
2014/01/17 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
和谐社区口号
2014/06/19 职场文书
新闻编辑求职信
2014/07/13 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
实习单位推荐信
2015/03/27 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python