1. PHP / Говнокод #9245

    +161

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    <?php
    function randomizer($min, $max, $maxn)
    {
        // $max = максимальное
        // $min = минимально
        // $maxn = сколько выдать
        $random = array(); // здесь будет массив наших чисел
        $tmp    = array(); // временный массив
        for ($i = 0; $i < $maxn; $i++) {
            do {
                $a = rand($min, $max);
            } while (isset($tmp[$a]));
            $tmp[$a]  = 1;
            $random[] = $a;
        }
        unset($tmp);
        return $random;
    }

    http://forum.ixbt.com/topic.cgi?id=24:33676#16

    Запостил: Unknown, 28 Января 2012

    Комментарии (18) RSS

    • Шикарная защита от повтора. А ведь можно получить тоже самое с линейной трудоемкостью, если уж автор не доверяет rand().

      А при max - min < maxn, будет вечный цикл.
      Ответить
      • а как эффективнее защититься от повторов?
        Ответить
        • Если это чисто мужской вопрос - презервативами. Своих повторов не получите.
          Ответить
        • использовать алгоритмы, дающие заданный период. К.О.
          Ответить
        • Если нябольшой интервал - нагенерить его числами от min до max и идти слева направо. На каждой итерации свопить i-ый элемент с j-ым который выбран рандомно.

          Если интервал достаточно большой то генерить с помощью отсортированного связного списка, у которого голова - минимальный элемент (включительно), а хвост - максимальный (не включается в множество). На каждой итерации pick-ать элемент из интервалов которые образуются 2-мя нодами, и добавлять ноду с выбранным элементом в список.
          Ответить
          • Хотя вставка все равно даст O(n). Лучше во втором варианте использовать массив - по нему бинарный поиск сделать ризонно.
            Ответить
            • Я этот код публиковал почти 10 лет назад. Как Вы тут оказались???
              Ответить
              • Ты давно вуз окончил?
                Ответить
                • Да. А Вы из нового поколения агрессивных школьников?
                  Ответить
              • Добро пожаловать в мир живых. Над вами совершили ритуал некромантии.
                Ответить
              • > Как Вы тут оказались???

                Ну это какие-то местные традиции, писать кому-то в какие-то несвежие говнокоды. И этот вопрос принято задавать так: "Как ты попал в этот тред?"

                https://gcode.space/#!/search?q="Как ты попал в этот тред%3F"
                Ответить
      • > вечный цикл

        В этом кейсе вообще надо исключение кидать, имхо. Т.к. задача не имеет решений. Ну нельзя из 2 элементов выбрать три без повторов.
        Ответить
    • for -> while -> foreach -> goto, в конце-то, блять, концов!!111
      Ответить
      • foreach это как раз самое высокоуровневое. Т.е. надо так:
        foreach -> for -> while -> goto
        Ответить
    • vanished
      Ответить

    Добавить комментарий