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 相关文章推荐
PHP中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
php获取apk包信息的方法
Aug 15 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
php静态文件返回304技巧分享
Jan 06 PHP
php绘制一个矩形的方法
Jan 24 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
PHP预定义接口――Iterator用法示例
Jun 05 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
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
2013/06/24 PHP
jQuery入门知识简介
2010/03/04 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
Python如何实现爬取B站视频
2020/05/20 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
法院授权委托书范文
2014/08/02 职场文书
代理人委托书
2014/09/16 职场文书
优秀党员推荐材料
2014/12/18 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
七年级数学教学反思
2016/02/17 职场文书
netty 实现tomcat的示例代码
2022/06/05 Servers