22-23 это наилучший возможный результат
это один из наилучших возможных, есть еще 23-22
Форум → Программирование → PHP для идиотов → Контролируемый рандом
Страницы: ← Предыдущая страница →
18 апреля 2012 г. 21:38, спустя 41 секунду
22-23 это наилучший возможный результат
18 апреля 2012 г. 21:39, спустя 1 минуту 30 секунд
18 апреля 2012 г. 22:00, спустя 20 минут 35 секунд
18 апреля 2012 г. 22:57, спустя 57 минут 19 секунд
function dudeRandom(players, dudeId) {
return {
teamA: players.splice(dudeId, 1),
teamB: players
}
}
18 апреля 2012 г. 23: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";
19 апреля 2012 г. 2:53, спустя 3 часа 42 минуты 51 секунду
19 апреля 2012 г. 6:51, спустя 3 часа 58 минут 33 секунды
спасибо р2д2 :D
Страницы: ← Предыдущая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!