php权重分配
2024-09-01 19:33:48
假设有3个人 能力的权重 分别为 A=>1,B=>2,C=>3,那么当有6个案子的时候 A分配到1个,B分配到2个,C分配到3个,这很合理,但是当案子只有5个,或者有7个的时候,怎么分配才算公平呢?而且案子也是一个一个相继产生的,怎么动态分配才算合理呢?
我想到的是将权重大小转换为每个案子被分配到的概率大小,并且加上“周期”结算,这样每个案子的分配就达到了最合理,最优化。
下面直接上代码----
class WeightService {
protected $container;
protected $weight = 0; public function __construct($arr)
{
if (!count($arr)){
$this->container = [];
}else {
foreach ($arr as $item) {
$weight = $item['weight'] * 10000;//扩大权重 提高单次的精确度 我感觉是有用的=。= 觉得没用的 可以拿掉 哈哈哈~
$this->weight += $weight;
$array['id'] = $item['id'];
$array['weight'] = $weight;
$container[] = $array;
}
$this->container = $container;
}
} public function getUid()
{
$random = $this->random();
//初始化区间参数
$left = 0;//左闭区间
$right = 0;//右开区间
foreach ($this->container as $item){
//区间宽度
$size = $item['weight'];
//右区间 + 区间宽度
$right += $size;
if ($random >= $left && $random < $right) {
return $item['id'];
}else{
//准备下一轮的循环 左区间 + 区间宽度
$left += $size;
}
}
return 0;
} protected function random()
{
//右边是开区间 这个生成的是闭区间 所以要 -1
return mt_rand(0, $this->weight - 1);
}
}
附上测试数据精确度
测试数据可以看出精确度在99.95%以上。可以说是非常精确合理了。
至于刚才说到“周期”的问题,解决办法就是加上一个类似“动态权重”的字段,每次被分配到减1,直到0为止。
当所有的账号都是0的时候,说明一轮分配结束,动态权重的值全部重新初始化为权重的值,新一轮的分配开始。
到此,就完美的解决了权重分配的所有问题。
本文属于个人原创,欢迎转载,转载请附链接:https://www.cnblogs.com/x-x-j/p/12021643.html
最新文章
- Yii2初谈
- Mac 显示和隐藏 隐藏文件
- 【新手练习】类似Path的按钮,
- Model Thinking1
- 格而知之2:UIView的autoresizingMask属性探究
- C程序的存储空间布局
- iOS开发之CALayer
- spring mvc中获取请求URL
- 前端基础进阶(五):全方位解读this
- Linux基础(五) Shell函数
- git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法
- c# C#获取屏幕鼠标坐标点颜色
- 初级字典树查找在 Emoji、关键字检索上的运用 Part-3
- Unable to open file &#39;.RES&#39;
- 用C#开发的双色球走势图(原创)值得园友拥有
- 前端模块化(AMD和CMD、CommonJs)
- KVO的用法、底层实现原理
- LVS持久化
- JavaScript JSON.parse()和JSON.stringify()
- CF763E Timofey and our friends animals