分享一个权重随机算法

<?php
    class WeightedRoundRobin{

        private static $_weightArray = array();

        private static $_i = -1;//代表上一次选择的服务器
        private static $_gcd;//表示集合S中所有服务器权值的最大公约数
        private static $_cw = 0;//当前调度的权值
        private static $_max;
        private static $_n;//agent个数

        public function init()
        {

        }

        public function initParam(array $weightArray)
        {
            self::$_weightArray = $weightArray;
            self::$_gcd = self::getGcd(self::$_weightArray);
            self::$_max = self::getMaxWeight(self::$_weightArray);
            self::$_n = count($weightArray);
        }

        private static function getGcd(array $weightArray)
        {
            $temp = array_shift($weightArray);
            $min = $temp['weight'];
            $status = false;
            foreach ($weightArray as $val) {
                $min = min($val['weight'],$min);
            }

            if($min == 1){
                return 1;
            }else{

                for ($i = $min; $i>1; $i--) {

                    foreach ($weightArray as $val) {
                        if (is_int($val['weight']/$i)) {
                            $status = true;
                        }else{
                            $status = false;
                            break;
                        }
                    }
                    if ($status) {
                        return $i;
                    }else {
                        return 1;
                    }

                }
            }

        }

        private static  function getMaxWeight(array $weightArray)
        {
            if(empty($weightArray)){
                return false;
            }
            $temp = array_shift($weightArray);
            $max = $temp['weight'];
            foreach ($weightArray as $val) {
                $max = max($val['weight'],$max);
            }
            return $max;
        }

        public function getWeight()
        {
            while (true){

                self::$_i = ((int)self::$_i+1) % (int)self::$_n;

                if (self::$_i == 0) {

                    self::$_cw = (int)self::$_cw - (int)self::$_gcd;
                    if (self::$_cw <= 0) {
                        self::$_cw = (int)self::$_max;

                        if (self::$_cw == 0) {
                            return null;
                        }
                    }
                }

                if ((int)(self::$_weightArray[self::$_i]['weight']) >= self::$_cw) {
                    return self::$_weightArray[self::$_i]['id'];
                }
            }
        }
    }
php
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

你这代码能做下 markdown 排版么 :joy:

5年前 评论

我在我们业务中试验了一下。正常下单 按照不同权重分配。不太行。。特别是只有2条记录的时候。总是拿读取出来的第一条数据..

还是说我使用的姿势不对?…

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!