我有越來越多的所謂的戰鬥分組在不同的等級。我想隨機顯示給用戶的戰鬥。顯示率由排名第一的位置(更高的排名 - 更多的印象)和第二層次是從這個排名的收集隨機戰鬥。每一場戰鬥都有自己的印象。PHP隨機數字與兩個級別的權重
在$戰鬥中,我從數據庫中獲得戰鬥力,並執行一些計算來定義每個級別應該獲得的顯示比率和展示次數。
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次)結束。
隨機化的第二個級別應該是一個等級的戰鬥,由他們的印象加權。這就是爲什麼隨機函數是遞歸的原因。
如何爲每場戰鬥設置權重?更高等級的戰鬥應該比其他戰鬥更頻繁地出現。 – kachar