设为首页 收藏本站
查看: 759|回复: 0

[经验分享] PHP随机红包算法

[复制链接]

尚未签到

发表于 2017-12-29 19:45:10 | 显示全部楼层 |阅读模式
  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 }
  

  多次统计
DSC0000.jpg

  第二种, 对其简单扩展一下, 每个红包的最大金额是: (剩余金额/剩余红包数)*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个豆;
  去掉这些必须剩余的豆数后, 以剩下的豆数的平均值为最大值进行随机生成本次豆数

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429471-1-1.html 上篇帖子: php中curl的详细解说 下篇帖子: PHP批量删除做法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表