5
回答
PHP 按百分比分配算法
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

分配变量固定,每一个分配变量可设置分配百分比(分配权重).所有变量百分比加起来等于100.

分配量未知.就好比LVS的负载均衡算法一样..求高手指点...

PHP
举报
将筱云
发帖于1年前 5回/1K+阅
共有5个答案 最后回答: 1年前
是不是举个例子好点,比如有个方法 function set($arr){
}

$arr是一个数组,传入值为 array(1,2,3,4,5,6);。这样的话就在set方法里面循环求总数,再循环求百分比。

说个思路吧:1.求节点所有权重的总数sum

2.求0-sum的一个随机数rd

2..接着遍历所有节点(访问顺序可以任意).将当前节点的权重值加上前面访问的各节点权重值得curWt,判断curWt >=  rd,如果条件成立则返回当前节点,如果不是则继续累加下一节点,直到最后。

java的,你可以参考一下

/**
     * 概率命中算法
     *
     * @param rates 各种概率值
     * @return 命中的索引位置
     */
    public static int hitProbability(int[] rates) {
        int totals = 0;
        for (int rate : rates) {
            totals += rate;
        }
        //取[1, totals]闭区间中的一个随机数
        double randomPoint = MathUtils.random(1, totals);
        for (int i = 0; i < rates.length; i++) {
            if (randomPoint < rates[i]) {
                return i;
            } else {
                randomPoint -= rates[i];
            }
        }
        return rates.length - 1;
    }

    /**
     * 概率命中算法
     *
     * @param rates 各种概率值
     * @return 命中的索引位置
     */
    public static int hitProbability(double[] rates) {
        double totals = 0d;
        for (double rate : rates) {
            totals += rate;
        }
        //取(0, totals]之间的随机数
        double randomPoint = random.nextDouble() * totals;
        for (int i = 0; i < rates.length; i++) {
            if (randomPoint < rates[i]) {
                return i;
            } else {
                randomPoint -= rates[i];
            }
        }
        return rates.length - 1;
    }



function getIdByRate($list){
	$totalRate = 0; // 总概率
	foreach ($list as $row) {
		$totalRate += $row['rate'];
	}
	$maxWeight = 100000; // 最大权重
	$realMaxWeight = $maxWeight * ($totalRate / 100); // 真实最大权重
	$rowWeight = mt_rand(0, $realMaxWeight); // 中奖权重
	
	$weight = 0; // 当前权重
	foreach ($list as $row) {
		$rate = $row['rate'] / 100;
		$weight += $rate * $maxWeight;
		
		if ($rowWeight <= $weight) {
			return $row['id'];
		}
	}
	
	return 0;
}
	
	$list = array(
            array(
                'id' => 1,
                'rate' => 99.9
            ),
            array(
                'id' => 2,
                'rate' => 0.1
            ),
            array(
                'id' => 3,
                'rate' => 1
            )
        );
        $result = array(
            1 => 0,
            2 => 0,
            3 => 0
        );
        for ($i = 0; $i < 10000; $i ++) {
            $result[getIdByRate($list)] ++;
        }
        var_dump($result);



顶部