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

php权重分配的更多相关文章

  1. Nginx upstream的5种权重分配方式【转】

    原文地址:Nginx upstream的5种权重分配方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weig ...

  2. Nginx Windows下安装使用及权重分配

    内容目录 Nginx 下载启动Nginx关闭NginxNginx使用注意事项使用Nginx代理服务器做负载均衡Nginx配置静态资源Nginx权重分配方式Nginx负载均衡参数描述写在最后 Nginx ...

  3. Nginx upstream的5种权重分配方式

    .轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器down掉,能自动剔除 .weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况. upstre ...

  4. Nginx upstream的5种权重分配方式分享

    Nginx负载均衡的分发方式有4种: 1.轮询,默认采取此方式,Nginx会按照请求时间的先后顺序进行轮询分发,若某台Web Server宕机,Nginx自动将其摘掉. 2.weight,权重,即轮询 ...

  5. Nginx upstream的5种权重分配方式(转)

    出处:http://www.cnblogs.com/funsion/p/4003499.html?utm_source=tuicool 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器, ...

  6. Android——学习:线性布局权重分配

    LinearLayout在Android中被广泛使用,LinearLayout有一个比较重要的属性——android:layout_weight.按照字面理解就是该控件的权重,这个值默认是 零(0). ...

  7. CRM销售人员针对的客户的权重分配的思想

    巧妙使用权重http://www.ziawang.com/article/52/ Django 项目CRM总结 - Pythia丶陌乐 - 博客园https://www.cnblogs.com/sup ...

  8. 查验身份证 (15 分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

    // test4.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束.// #include "pch.h"#include <ios ...

  9. LinearLayout线性布局搭配权重属性的使用

    在开发中,我们是通过布局来完成应用界面的搭配的,通过各种布局,我们可以完成各种复杂的界面设计.而LinearLayout也就是我们说的线性布局,这个比较简单而且使用很广泛的一种布局.下面我们通过一个D ...

随机推荐

  1. python私有变量的分类

  2. Hybrid App: 了解JavaScript如何与Native实现混合开发

    一.简介 Hybrid Development混合开发是目前移动端开发异常火热的新兴技术,它能够实现跨平台开发,极大地节约了人力和资源成本.跨平台开发催生了很多新的开源框架,就目前而言,在混合开发中比 ...

  3. [转载]【转】教你如何实现linux和Windows之间的文件共享,samba的安

    原文地址:[转]教你如何实现linux和Windows之间的文件共享,samba的安装与配置作者:铅笔小蜡 本人在虚拟机下装fedora13,已经实现.1. 首先检查os是否安装好了samba. [r ...

  4. MyBatis批量插入模板

    oracle: <insert id="insertBatch" parameterType="List"> INSERT INTO TStuden ...

  5. git push后出现错误 ![rejected] master -> master(non-fast-forward) error:failed to push some refs to 'XXX'

    本地创建了一个project并在GitHub上创建了一个仓库,想要将本地的仓库链接到远程仓库我用的是如下方法:git init    //初始化本地仓库git remote add origin XX ...

  6. Thrift总结(四)Thrift实现双向通信

    前面介绍过 Thrift 安装和使用,介绍了Thrift服务的发布和客户端调用,可以查看我之前的文章:https://www.cnblogs.com/zhangweizhong/category/10 ...

  7. Spring框架学习笔记(7)——Spring Boot 实现上传和下载

    最近忙着都没时间写博客了,做了个项目,实现了下载功能,没用到上传,写这篇文章也是顺便参考学习了如何实现上传,上传和下载做一篇笔记吧 下载 主要有下面的两种方式: 通过ResponseEntity实现 ...

  8. c#控制台玩飞行棋游戏

    using System; namespace Game{ class Program { //用静态字段模拟全局变量 public static int[] Maps = new int[100]; ...

  9. 如何解决UNMOUNTABLE BOOT VALUME

    Windows error:UNMOUNTABLE BOOT VALUME 解决方法:Windows 修复工具 chkdsk命令 chkdsk D:/f ps:chkdsk 磁盘名 /f

  10. 【并发编程】synchronized的使用场景和原理简介

    1. synchronized使用 1.1 synchronized介绍 在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁.但是,随着Java SE 1.6对sy ...