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下的权限算法的实现
Apr 28 PHP
PHP 反向排序和随机排序代码
Jun 30 PHP
解析argc argv在php中的应用
Jun 24 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
php使用curl访问https示例分享
Jan 17 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
浅谈php命令行用法
Feb 04 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
codeigniter实现get分页的方法
Jul 10 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
php根据命令行参数生成配置文件详解
Mar 15 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
PHP输入流php://input介绍
2012/09/18 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
php探针不显示内存解决方法
2019/09/17 PHP
php文件包含的几种方式总结
2019/09/19 PHP
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
python基础教程之序列详解
2014/08/29 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
python安装Scrapy图文教程
2017/08/14 Python
Python装饰器知识点补充
2018/05/28 Python
Python Grid使用和布局详解
2018/06/30 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
医药大学生求职简历的自我评价
2013/10/17 职场文书
质量主管工作职责
2014/09/26 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
师德师风整改措施
2014/10/24 职场文书
数学教师个人工作总结
2015/02/06 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL
hive数据仓库新增字段方法
2022/06/25 数据库