php实现的微信红包算法分析(非官方)


Posted in PHP onSeptember 25, 2015

本文实例讲述了php实现的微信红包算法。分享给大家供大家参考。具体如下:

最近一直在微信群里体验红包功能,红包类型有两种:

1. 普通红包

2. 拼手气红包

普通红包就不用多解析了,大锅饭原理,平分。

拼手气红包讲的是手气(运气),有人可以抢到很多,有人抢的少得可怜,当然也不是先抢就一定多,说到底了就是随机。

php实现的微信红包算法分析(非官方)

想了想,自己写写看,能不能实现类似的功能(不敢说是算法)。

// $bonus_total 红包总金额
// $bonus_count 红包个数
// $bonus_type 红包类型 1=拼手气红包 0=普通红包
function randBonus($bonus_total=0, $bonus_count=3, $bonus_type=1){
  $bonus_items  = array(); // 将要瓜分的结果
  $bonus_balance = $bonus_total; // 每次分完之后的余额
  $bonus_avg   = number_format($bonus_total/$bonus_count, 2); // 平均每个红包多少钱
  $i       = 0;
  while($i<$bonus_count){
    if($i<$bonus_count-1){
      $rand      = $bonus_type?(rand(1, $bonus_balance*100-1)/100):$bonus_avg; // 根据红包类型计算当前红包的金额
      $bonus_items[] = $rand;
      $bonus_balance -= $rand;
    }else{
      $bonus_items[] = $bonus_balance; // 最后一个红包直接承包最后所有的金额,保证发出的总金额正确
    }
    $i++;
  }
  return $bonus_items;
}

好吧,我们现在来体验一下

// 发3个拼手气红包,总金额是100元
$bonus_items  = randBonus(100, 3, 1);
// 查看生成的红包
var_dump($bonus_items);
// 校验总金额是不是正确,看看微信有没有坑我们的钱
var_dump(array_sum($bonus_items));

另一个使用数组实现的版本,原理差不多:

function sendRandBonus($total=0, $count=3, $type=1){
  if($type==1){
    $input     = range(0.01, $total, 0.01);
    if($count>1){
      $rand_keys = (array) array_rand($input, $count-1);
      $last    = 0;
      foreach($rand_keys as $i=>$key){
        $current  = $input[$key]-$last;
        $items[]  = $current;
        $last    = $input[$key];
      }
    }
    $items[]    = $total-array_sum($items);
  }else{
    $avg      = number_format($total/$count, 2);
    $i       = 0;
    while($i<$count){
      $items[]  = $i<$count-1?$avg:($total-array_sum($items));
      $i++;
    }
  }
  return $items;
}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
Linux下ZendOptimizer的安装与配置方法
Apr 12 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
php单例模式实现方法分析
Mar 14 PHP
php封装的连接Mysql类及用法分析
Dec 10 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
PHP简单实现断点续传下载的方法
Sep 25 #PHP
分享3个php获取日历的函数
Sep 25 #PHP
PHP中配置IIS7实现基本身份验证的方法
Sep 24 #PHP
常见PHP数据库解决方案分析介绍
Sep 24 #PHP
又十个超级有用的PHP代码片段
Sep 24 #PHP
PHP易混淆知识整理笔记
Sep 24 #PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 #PHP
You might like
简单易用的计数器(数据库)
2006/10/09 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
javascript操作cookie
2017/01/17 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
python如何实现内容写在图片上
2018/03/23 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
python 魔法函数实例及解析
2019/09/25 Python
浅析Python3 pip换源问题
2020/01/06 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
大班幼儿评语大全
2014/04/30 职场文书
2014年个人售房协议书
2014/10/30 职场文书
天那边观后感
2015/06/09 职场文书
聘用合同范本
2015/09/21 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python