磊 的个人资料Mrgaolei的Blog照片日志列表 工具 帮助

日志


1月16日

PHP 计算权重算法

假设有一堆服务器,我根据他们的配置给他们打分,想通过一个函数,随机的到一个服务器实例,当然不是百分百随机,而是配置越高的服务器得到几率越高,这就是权重。写了半天写出来了个算法,不过目前还有有一点Bug,就是权重值不能有重复的,否则重复的永远不会得到。

<?php
/**

* 权重DEMO
*/

$data = array(
    array('server1', 5),
    array('server2', 10),
    array('server3', 5),
    array('server4', 7),
    array('server5', 3),
    array('server6', 31)
);
var_dump(checkWeight($data));

function checkWeight($data) {

    # 权重和
    $sum = 0;
    # 权重值不能有负数
    foreach ($data as $val) {
        if ($val[1] < 0) return false;
        $sum += $val[1];
    }

    # 根据权重数排序
    $sorted = true;
    while ($sorted) {
        $sorted = false;
        for ($i = 0; $i < count($data) - 1; $i ++) {
            if ($data[$i][1] < $data[$i + 1][1]) {
                swapvar(&$data[$i], &$data[$i + 1]);
                $sorted = true;
            }
        }
    }

    # 产生随机数,最小1,最大权重和
    $randnum = rand(1, $sum);
    echo $randnum;
    # 如果随机数大于等于最大值,返回最大
    if ($randnum >= $data[0][1]) return $data[0][0];
    # 如果随机数小于最小值,返回最小
    if ($randnum < $data[count($data) - 1][1]) return $data[count($data) - 1][0];
    for ($i = 0; $i < count($data) - 1; $i ++) {
        if ($randnum < $data[$i][1]) $current = $data[$i+1][0];
    }
    return $current;
}

function swapvar(&$var1, &$var2) {
    $tmpvar = $var1;
    $var1 = $var2;
    $var2 = $tmpvar;
}

评论

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

引用通告

此日志的引用通告 URL 是:
http://bdsunmsn.spaces.live.com/blog/cns!1EAE2E7F7915EDE9!283.trak
引用此项的网络日志