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

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

  • technobulka

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Spritz 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";
    Спустя 131 сек.
    на всякий случай сохраняю ключи массивов. вдруг епсил захочет задавать игроков как id => skill — эта связка в командах сохранится )
    ιιlllιlllι унц-унц
  • md5

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

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

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

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

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

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

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

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