基于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 相关文章推荐
BBS(php &amp; mysql)完整版(七)
Oct 09 PHP
PHP 变量类型的强制转换
Oct 23 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
Yii实现复选框批量操作实例代码
Mar 15 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
php 解析非标准json、非规范json
Apr 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
第八节--访问方式
2006/11/16 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python标准库内置函数complex介绍
2014/11/25 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
详解python做UI界面的方法
2019/02/27 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
Django中的AutoField字段使用
2020/05/18 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
物流管理专业推荐信
2014/09/06 职场文书
辩护意见书
2015/06/04 职场文书
护理工作心得体会
2016/01/22 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书