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 miniBB中文乱码问题解决方法
Nov 25 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
Apr 11 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
php构造函数的继承方法
Feb 09 PHP
PHP+MYSQL实现用户的增删改查
Mar 24 PHP
php简单统计在线人数的方法
May 10 PHP
round robin权重轮循算法php实现代码
May 28 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP rmdir()函数的用法总结
Jul 02 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
CI框架Session.php源码分析
2014/11/03 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
python groupby 函数 as_index详解
2019/12/16 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
悬挂训练绳:TRX
2017/12/14 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
电子技术专业中专生的自我评价
2013/12/17 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
大学生年度个人总结
2015/02/15 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang