2012-07-02 42 views
0

我有越來越多的所謂的戰鬥分組在不同的等級。我想隨機顯示給用戶的戰鬥。顯示率由排名第一的位置(更高的排名 - 更多的印象)和第二層次是從這個排名的收集隨機戰鬥。每一場戰鬥都有自己的印象。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次)結束。

隨機化的第二個級別應該是一個等級的戰鬥,由他們的印象加權。這就是爲什麼隨機函數是遞歸的原因。

回答

0

難道你不能在數據庫上這樣做嗎?喜歡的東西:

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

編輯

如果你想確保更高級別出現的比較頻繁,那麼我會做這樣的事情。假設等級1是最低等級,等級10是最高等級。

SELECT * FROM battles ORDER BY (Rank * RAND()) 
+0

如何爲每場戰鬥設置權重?更高等級的戰鬥應該比其他戰鬥更頻繁地出現。 – kachar