基于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 和 MySQL 基础教程(一)
Oct 09 PHP
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
如何使用脚本模仿登陆过程
Nov 22 PHP
php adodb分页实现代码
Mar 19 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 PHP
Yii2 批量插入、更新数据实例
Mar 15 PHP
yii2 resetful 授权验证详解
May 18 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 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
PHP编程与应用
2006/10/09 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
javascript 伪数组实现方法
2010/10/11 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
Python连接数据库学习之DB-API详解
2017/02/07 Python
Python制作Windows系统服务
2017/03/25 Python
Python3 socket同步通信简单示例
2017/06/07 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
企业宣传口号
2014/06/12 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
师德师风自查总结
2014/10/14 职场文书
培训感想范文
2015/08/07 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP