0

我有越来越多的所谓的战斗分组在不同的等级。我想随机化显示给用户的战斗。展示率由排名第一(排名越高 - 展示次数越多)定义的展示率,第二个级别是从该排名的收藏中获得随机战斗。排名中的每场战斗都有自己的印象数。

在 $battles 中,我从数据库中获取战斗,并执行一些计算来定义显示率和每个等级应该获得的印象。

foreach ($battles as $el => &$values) {
    $values['show_rate'] = $values['rank'] * 100 / $totals['sum_of_ranks'];
    $values['dedicated_impressions'] = $totals['total_battle_impressions'] * $values['show_rate'] / 100;
    $values['impressions_left'] = $values['dedicated_impressions'] - $values['sum_of_impressions'];
}

这是上一个循环的结果。在关键battle_ids我有这个等级的战斗的ID,在battle_impressions我有以相同方式排序的相同战斗的印象。

 $battles = array(
    0 => array(
        'battles_in_rank' => '1',
        'battle_ids' => array(
            0 => '28',
        ),
        'battle_impressions' => array(
            0 => '3',
        ),
        'sum_of_impressions' => '3',
        'rank' => '0',
        'show_rate' => 0,
        'dedicated_impressions' => 0,
        'impressions_left' => -3,
    ),
    1 => array(
        'battles_in_rank' => '4',
        'battle_ids' => array(
            0 => '27',
            1 => '19',
            2 => '18',
            3 => '17',
        ),
        'battle_impressions' => array(
            0 => '0',
            1 => '0',
            2 => '0',
            3 => '0',
        ),
        'sum_of_impressions' => '0',
        'rank' => '1',
        'show_rate' => 6.6666666666667,
        'dedicated_impressions' => 230.53333333333,
        'impressions_left' => 230.53333333333,
    ),
    2 => array(
        'battles_in_rank' => '2',
        'battle_ids' => array(
            0 => '7',
            1 => '3',
        ),
        'battle_impressions' => array(
            0 => '0',
            1 => '3',
        ),
        'sum_of_impressions' => '3',
        'rank' => '3',
        'show_rate' => 20,
        'dedicated_impressions' => 691.6,
        'impressions_left' => 688.6,
    ),
    3 => array(
        'battles_in_rank' => '2',
        'battle_ids' => array(
            0 => '12',
            1 => '5',
        ),
        'battle_impressions' => array(
            0 => '17',
            1 => '1',
        ),
        'sum_of_impressions' => '18',
        'rank' => '4',
        'show_rate' => 26.666666666667,
        'dedicated_impressions' => 922.13333333333,
        'impressions_left' => 904.13333333333,
    ),
    4 => array(
        'battles_in_rank' => '1',
        'battle_ids' => array(
            0 => '2',
        ),
        'battle_impressions' => array(
            0 => '3434',
        ),
        'sum_of_impressions' => '3434',
        'rank' => '7',
        'show_rate' => 46.666666666667,
        'dedicated_impressions' => 1613.7333333333,
        'impressions_left' => -1820.2666666667,
    ),
);

在我获得所有这些信息后,我执行清理以获得随机函数的良好结果。

$elements = array();
$weights = array();
foreach ($battles as $el => &$values) {
    $elements[] = array($values['battle_ids'], $values['battle_impressions']);
    $weights[] = $values['show_rate'];
}

这是我目前拥有的随机函数:

public function getRandom($values, $weights)
{
    $pos = mt_rand(1, array_sum($weights));
    $em = 0;
    foreach ($values as $k => $v) {
        $em += $weights[$k];
        if ($em >= $pos) {
            if (is_array($v)) {
                return $this->getRandom($v[0], $v[1]);
            } else {
                return $v;
            }
        }
    }
}

我这样称呼它以获得一个随机的战斗ID。

$this->getRandom($elements, $weights);

我需要的是拥有 5 或 10 个唯一的随机 ID。

它可以工作,但是这个函数每次调用只给我一个随机元素,当我多次调用它时,我经常得到相同的 id,比如 10 次中有 6 次。

例如,如果我需要 5 场随机战斗,我必须在一个循环中调用该函数,迭代 20-30 次才能获得 5 个独特的随机战斗。如果较高级别的战斗结束了,它应该用较低级别的战斗填充阵列,所以我总是以 5 场战斗(或 10 场)结束。

第二级随机化应该是一个等级的战斗,由他们的印象加权。这就是为什么随机函数是递归的。

4

1 回答 1

0

您不能在数据库上执行此操作吗?就像是:

SELECT * FROM battles ORDER BY Rank DESC, RAND()

编辑

如果你想确保更高的等级出现得更频繁,那么我会做这样的事情。假设等级 1 是最低等级,等级 10 是最高等级。

SELECT * FROM battles ORDER BY (Rank * RAND())
于 2012-07-02T09:11:22.060 回答