假设有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

最新文章

  1. Yii2初谈
  2. Mac 显示和隐藏 隐藏文件
  3. 【新手练习】类似Path的按钮,
  4. Model Thinking1
  5. 格而知之2:UIView的autoresizingMask属性探究
  6. C程序的存储空间布局
  7. iOS开发之CALayer
  8. spring mvc中获取请求URL
  9. 前端基础进阶(五):全方位解读this
  10. Linux基础(五) Shell函数
  11. git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法
  12. c# C#获取屏幕鼠标坐标点颜色
  13. 初级字典树查找在 Emoji、关键字检索上的运用 Part-3
  14. Unable to open file &#39;.RES&#39;
  15. 用C#开发的双色球走势图(原创)值得园友拥有
  16. 前端模块化(AMD和CMD、CommonJs)
  17. KVO的用法、底层实现原理
  18. LVS持久化
  19. JavaScript JSON.parse()和JSON.stringify()
  20. CF763E Timofey and our friends animals

热门文章

  1. GitHub_Hexo_Next 搭建博客
  2. 获取Ubuntu的Docker CE
  3. 一文学会Go语言
  4. 如何在SqlServer中使用层级节点类型hierarchyid
  5. 『题解』洛谷P5015 标题统计
  6. javascript JSMpeg.js 播放视频解决不用全屏也能播放(也支持自动播放哦)
  7. sublime3中运行python文件
  8. javascript监听手机返回键
  9. mysql字符集那些事
  10. Python 基础 内置函数 迭代器与生成器