ФорумПрограммированиеPHP для идиотов → Контролируемый рандом

Контролируемый рандом

  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 18 апреля 2012 г. 10:38, спустя 41 секунду

    22-23 это наилучший возможный результат

    это один из наилучших возможных, есть еще 23-22
    Высокоуровневое абстрактное говно
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 18 апреля 2012 г. 10:39, спустя 1 минуту 30 секунд

    в конце рандомно поменяем командлы местами )))
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 апреля 2012 г. 11:00, спустя 20 минут 35 секунд

    я один хули всех там замочу :D
    Сапожник без сапог
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 18 апреля 2012 г. 11:57, спустя 57 минут 19 секунд

    function dudeRandom(players, dudeId) {
        return {
            teamA: players.splice(dudeId, 1),
            teamB: players
        }
    }

    XDD
    Высокоуровневое абстрактное говно
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 18 апреля 2012 г. 12:10, спустя 12 минут 44 секунды

    Люблю дурацкие задачи. Набросал тест для парного и несимметричного распределения. В большинстве случаев расхождение только на нулевых игроках.
    
    Total 8 players: (0, 6, 18, 18, 7, 1, 0, 14)
    
    Pairs distribution:
    Team A is (18, 14, 1, 0), skill = 33
    Team B is (18, 7, 6, 0), skill = 31
    
    Skew distribution:
    Team A is (18, 14, 0, 0), skill = 32
    Team B is (18, 7, 6, 1), skill = 32
    


    
    <?php
    
    error_reporting(-1);
    ini_set('display_errors', 'on');
    
    class Teams
    {
    	static function total_skill(array $team)
    	{
    		$sum = 0;
    		foreach ($team as $p) $sum += $p;
    		return $sum;
    	}
    
    	static function distribute($players, &$a, &$b)
    	{
    		arsort($players);
    		foreach ($players as $k => $v) {
    			if (self::total_skill($a) <= self::total_skill($b))
    				$a[$k] = $v;
    			else
    				$b[$k] = $v;
    		}
    	}
    
    	static function distribute_pairs($players, &$a, &$b)
    	{
    		arsort($players);
    		reset($players); 
    		$n = count($players);
    		while ($n >= 2) {
    			// Pop two players with maximum skill
    			list($k1, $v1) = each($players);
    			list($k2, $v2) = each($players);
    			if ($v2 > $v1) {
    				// swap
    				list($k1, $k2) = array($k2, $k1);
    				list($v1, $v2) = array($v2, $v1);
    			}
    			// Now v1 is maximum of two
    			if (self::total_skill($a) <= self::total_skill($b)) {
    				$a[$k1] = $v1;
    				$b[$k2] = $v2;
    			} else {
    				$b[$k1] = $v1;
    				$a[$k2] = $v2;
    			}
    			$n -= 2;
    		}
    		// Odd number of players
    		if ($n > 0)
    			self::distribute(array_slice($players, -1, 1, TRUE), $a, $b);
    	}
    
    }
    
    $max_skill = 20;
    $num_players = mt_rand(6, 15);
    
    $players = array();
    for ($i = 1; $i <= $num_players; ++$i) {
    	$players[$i] = mt_rand(0, $max_skill); // player_id => skill
    }
    
    echo 'Total '.count($players).' players: ('.implode(', ', $players) . ")<br/>\n";
    
    echo "<br/>\nPairs distribution:<br/>\n";
    $A = $B = array();
    Teams::distribute_pairs($players, $A, $B);
    echo 'Team A is ('.implode(', ', $A).'), skill = '.Teams::total_skill($A)."<br/>\n";
    echo 'Team B is ('.implode(', ', $B).'), skill = '.Teams::total_skill($B)."<br/>\n";
    
    echo "<br/>\nSkew distribution:<br/>\n";
    $A = $B = array();
    Teams::distribute($players, $A, $B);
    echo 'Team A is ('.implode(', ', $A).'), skill = '.Teams::total_skill($A)."<br/>\n";
    echo 'Team B is ('.implode(', ', $B).'), skill = '.Teams::total_skill($B)."<br/>\n";
    
    Спустя 131 сек.
    на всякий случай сохраняю ключи массивов. вдруг епсил захочет задавать игроков как id => skill — эта связка в командах сохранится )
    ιιlllιlllι унц-унц
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 18 апреля 2012 г. 15:53, спустя 3 часа 42 минуты 51 секунду

    во, нормал
    спасибо р2д2 :D
    Спустя 22 сек.
    шутка, щас буду читать, что вы напиздели)
    все умрут, а я изумруд
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 18 апреля 2012 г. 19:51, спустя 3 часа 58 минут 33 секунды

    спасибо р2д2 :D

    так вот что его ник значит оО
    Высокоуровневое абстрактное говно

Пожалуйста, авторизуйтесь, чтобы написать комментарий!