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编写大型网站问题集
Mar 06 PHP
openPNE常用方法分享
Nov 29 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
PHP反射API示例分享
Oct 08 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
php连接MSsql server的五种方法总结
Mar 04 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 计划任务 检测用户连接状态
2012/03/29 PHP
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
vue头部导航动态点击处理方法
2018/11/02 Javascript
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
Python调用C语言程序方法解析
2020/07/07 Python
利用python汇总统计多张Excel
2020/09/22 Python
大学生毕业自我鉴定范文
2013/09/19 职场文书
初任培训自我鉴定
2013/10/07 职场文书
音乐教学随笔感言
2014/02/19 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
弄虚作假心得体会
2014/09/10 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电