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 快速生成 Flash 动画的方法
Mar 06 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
mysql数据库差异比较的PHP代码
Feb 05 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
ThinkPHP项目分组配置方法分析
Mar 23 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
Aug 02 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三层结构(上) 简单三层结构
2010/07/04 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
微信支付开发发货通知实例
2016/07/12 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
js常用排序实现代码
2010/12/28 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python生成圆形图片的方法
2020/03/25 Python
Atom的python插件和常用插件说明
2018/07/08 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
详解爬虫被封的问题
2019/04/23 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python中安装django模块的方法
2020/03/12 Python
python selenium操作cookie的实现
2020/03/18 Python
生物技术毕业生自荐信
2013/10/23 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
施工安全责任书
2014/04/14 职场文书
秋天的图画教学反思
2014/05/01 职场文书
关于读书的活动方案
2014/08/14 职场文书
2014年维修工作总结
2014/11/22 职场文书
2015年派出所工作总结
2015/04/24 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技