我越来越多的所谓的战斗分为不同的等级。我想随机化显示给用户的战斗。显示率由排名第一位(更高级别 - 更多印象)定义,第二级是从该排名中的集合中获得随机战斗。排名中的每场战斗都有自己的印象次数。
在$ 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
中我有这个等级中的战斗的ids,在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次)。
第二级随机化应该是一个级别的战斗,按其印象加权。这就是随机函数递归的原因。
答案 0 :(得分:0)
你能否在数据库上做到这一点?类似的东西:
SELECT * FROM battles ORDER BY Rank DESC, RAND()
修改强>
如果你想确保更高级别的出现更频繁,那么我会做这样的事情。假设等级1是最低等级而等级10是最高等级。
SELECT * FROM battles ORDER BY (Rank * RAND())