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 相关文章推荐
第一节--面向对象编程
Nov 16 PHP
php 设计模式之 单例模式
Dec 19 PHP
php 删除数组元素
Jan 16 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
php操作xml入门之cdata区段
Jan 23 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
浅析PHP数据导出知识点
Feb 17 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
Sep 10 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
MySQL最常见的操作语句小结
2015/05/07 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
大学毕业生推荐信
2014/07/09 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
学习十八大标语
2014/10/09 职场文书
学期个人工作总结
2015/02/13 职场文书
Python竟然能剪辑视频
2021/05/25 Python
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android