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动态生成VRML网页
Oct 09 PHP
注意:php5.4删除了session_unregister函数
Aug 05 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
PHP使用内置dir类实现目录遍历删除
Mar 31 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
PHP实现随机发扑克牌
Apr 22 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以ROOT权限执行系统命令的方法
2011/02/10 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
PHP合并静态文件详解
2014/11/14 PHP
js添加table的行和列 具体实现方法
2013/07/22 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
scrapy爬虫完整实例
2018/01/25 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Python多线程的退出控制实现
2020/08/10 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
工地标语大全
2014/06/18 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
廉政承诺书
2015/01/19 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Win11开始菜单添加休眠选项
2022/04/19 数码科技
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL
MySQL数据库 任意ip连接方法
2022/05/20 MySQL