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 相关文章推荐
一次编写,随处运行
Oct 09 PHP
PHP 5.0 Pear安装方法
Dec 06 PHP
php 变量未定义等错误的解决方法
Jan 12 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
Symfony2函数用法实例分析
Mar 18 PHP
Yii多表联合查询操作详解
Jun 02 PHP
功能强大的php文件上传类
Aug 29 PHP
thinkPHP引入类的方法详解
Dec 08 PHP
PHP如何通过date() 函数格式化显示时间
Nov 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
php绘制一个矩形的方法
2015/01/24 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Python实现12306火车票抢票系统
2019/07/04 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
2014年教务工作总结
2014/12/03 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
Redis Lua脚本实现ip限流示例
2022/07/15 Redis