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个豆;

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

目录
相关文章
|
6月前
|
存储 算法 安全
百度搜索:蓝易云【php几种常用的加密解密算法】
请注意,以上算法都有各自的特点和用途,选择合适的加密解密算法应根据具体需求和安全性要求。此外,加密只是数据保护的一部分,安全实现还应考虑其他因素,如密钥管理、访问控制和安全传输等。
78 0
|
4月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
32 1
|
5月前
|
算法 PHP 数据中心
基于php雪花算法工具类Snowflake -来自chatGPT
基于php雪花算法工具类Snowflake -来自chatGPT
|
搜索推荐 算法 PHP
PHP 数组(Array) - 排序算法
PHP 数组(Array) - 排序算法
45 0
|
存储 监控 算法
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
242 0
|
算法 PHP 数据库
如何使用PHP编写一个人脸识别算法?底层原理是什么?
如何使用PHP编写一个人脸识别算法?底层原理是什么?
225 0
|
JavaScript 前端开发 PHP
一段javascript转PHP的encrypt加密算法
javascript 常用函数转换成PHP代码处理
|
存储 算法 PHP
唯一ID生成原理与PHP实现-雪花算法
唯一ID生成原理与PHP实现-雪花算法
654 0
唯一ID生成原理与PHP实现-雪花算法
|
Web App开发 算法 JavaScript
JS中数组随机排序实现(原地算法sort/shuffle算法)
JS中数组随机排序实现(原地算法sort/shuffle算法)
296 1
JS中数组随机排序实现(原地算法sort/shuffle算法)
|
算法 PHP
php关于数组n个随机数分成x组,使每组值相近的算法
php关于数组n个随机数分成x组,使每组值相近的算法
109 0
php关于数组n个随机数分成x组,使每组值相近的算法