开发者社区> mydcool> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PHP随机红包算法

简介: 2017年1月14日 14:19:14 星期六 一, 整体设计 算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记录各种需要的数据 二, 红包算法  简便起见, 红包金额用整数表示, 假设每个红包里边有x个糖豆, 每个人最少一...
+关注继续查看

2017年1月14日 14:19:14 星期六

一, 整体设计

算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记录各种需要的数据

二, 红包算法 

简便起见, 红包金额用整数表示, 假设每个红包里边有x个糖豆, 每个人最少一个豆

一种: 每个红包的最大金额是: (剩余金额/剩余红包数)*2, 需要开始的时候预先分配给每个人一个豆

 1 function randBean($total_bean, $total_packet)
 2 {
 3     $min_bean = 1;
 4     $max_bean = 5000;
 5     $range = 2;
 6     
 7     $total_bean = $total_bean - $total_packet * $min_bean; //每个人预留一个最小值
 8 
 9     $list = [];
10     $min = 1;
11     while(count($list) < $total_packet){
12         $max = floor($total_bean / $total_packet) * $range;
13         $bean = rand($min, $max);
14 
15         if ($bean <= $max_bean - 1) {
16             $list[] = $bean;
17             $total_bean -= $bean;
18         }
19     }
20 
21     $list[] = $total_bean;//剩余的金豆作为最后一个红包
22 
23     //合并
24     foreach ($list as $k => $v) {
25         $list[$k] += $min_bean;
26     }
27 
28     return $list;
29 }

多次统计

 

第二种, 对其简单扩展一下, 每个红包的最大金额是: (剩余金额/剩余红包数)*3; 但是要求每次最少发2个红包

第三种, 线段法, 随机生成几个数字, 将一个直线分成几段, 每段的长度(这个波动比较大, 不是很平均, 如果限制了每个红包的大小, 会比较麻烦)

 1 function abc ($total_bean, $total_packet)
 2 {    
 3     $min = 1;
 4     $max = $total_bean -1;
 5     $list = [];
 6     
 7     $maxLength = $total_packet - 1;
 8     while(count($list) < $maxLength) {
 9         $rand = mt_rand($min, $max);
10         empty($list[$rand]) && ($list[$rand] = $rand);
11     }
12     
13     $list[0] = 0; //第一个
14     $list[$total_bean] = $total_bean; //最后一个
15     
16     sort($list); //不再保留索引
17     
18     $beans = [];
19     for ($j=1; $j<=$total_packet; $j++) {
20         $beans[] = $list[$j] - $list[$j-1];
21     }
22     
23     // return $beans;
24     echo '<pre>'; print_r($beans); echo array_sum($beans);
25 }
26 
27 abc(100000, 3);

 

第四种:

因为每人最少1个豆, 那么每次随机生成豆数的时候要预留 剩余人数*1个豆;

去掉这些必须剩余的豆数后, 以剩下的豆数的平均值为最大值进行随机生成本次豆数

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
微信发送红包示例(php)
微信红包接口 微信红包是微信支付推出的一款基于微信客户端的免费服务应用,微信红包以微信支付 为核心安全保障,为广大用户提供安全,快捷的移劢支付服务。   请求URL 现金红包 https://api.mch.
1185 0
PHP连接MySQL 8.0报错的解决办法
PHP连接MySQL 8.0报错的解决办法
193 0
centos下 Apache、php、mysql默认安装路径
apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下 apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/apachectl web目录:/var/www/html 如果采用源代码安装,一般默认安装在/usr/local/apache2目录下 php: 如果采用RPM包安装,安装路
3025 0
在CentOs 5.1中使用rpm安装NGINX+php+mysql(一)
一、前言  同志们、朋友们、各位领导,大家好。    VCKBASE 不得了,     网友众多文章好。
832 0
MySQL PHP 语法
MySQL PHP 语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP。 在这些语言中,Mysql在PHP的web开发中是应用最广泛。 在本教程中我们大部分实例都采用了 PHP 语言。
799 0
Windows Server 2008,IIS7.5中配置(安装)PHP+MySql运行环境全程实录
一.安装前准备好要用到的文件 mysql-essential-5.1.40-win32.msi (MySql数据库安装文件) php-5.2.0-Win32.zip(PHP代码解析器) phpMyAdmin-3.
2580 0
+关注
mydcool
php相关专家
286
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载