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根据分类合并数组的方法实例详解
Nov 06 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
PHP多文件上传类实例
Mar 07 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 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
example1.php
2006/10/09 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
用 javascript 实现的点击复制代码
2007/03/24 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
javascript 一些用法小结
2009/09/11 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
基于python实现地址和经纬度转换
2020/05/19 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
社区健康教育工作方案
2014/06/03 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
python脚本框架webpy的url映射详解
2021/11/20 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
Python获取字典中某个key的value
2022/04/13 Python