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

    +174

    1. 1
    2. 2
    3. 3
    shuffle($answers);
    shuffle($answers);
    shuffle($answers);

    Чтобы наверняка

    Запостил: Shiz89, 21 Апреля 2010

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

    • Забавно будет, если массив в конечном итоге перемешается к тому же виду, в каком был в начале :)
      Ответить
      • изначальный порядок тоже можно считать "перемешанным".
        Ответить
        • Если требуется перемешать -- значит не перемешанный. Даже если и не отсортированный.
          Ответить
          • согласен. теория теорией, но практически-семантически значит, что он скорей всего "неперемешанный".
            Ответить
            • Если посадить много-много обезьян за печатные машинки, то за миллион лет одна из них напечатает "Война и мир". Можно ли это назвать случайным набором символов?

              Что такое перемешивание? Это случайная выборка из всех возможных вариантов перестановки элементов. Исходное значение входит в один из таких вариантов. Так что с точки зрения комбинаторики, исходное значение отвечает условию "перемешивание"
              Ответить
              • > Так что с точки зрения комбинаторики, исходное значение отвечает условию "перемешивание"

                а я говорю, что в жопу эту комбинаторику-шмомбинаторику. с точки зрения юзера/логики прогарммы массив до shuffle'а неперемешан. взгляни на переменную: answers. Ты блин с точки зрения теории тоже перемешанный. Иди перемешивайся дальше :)
                Ответить
                • С точки зрения юзера любой набор будет случайным, так как он не знает первоначального набора и вероятность, что два раза выпадет один и тот же набор минимальна.

                  Если не верите в науку, попробую объяснить на пальцах и примерах.

                  Допустим есть массив из трех элементов. Имеем 4!=24 возможных вариантов. Чем первый набор хуже 3-го, 5-го или 20-го? По теории вероятности он может выпасть с равной степенью вероятности.

                  Второй пример - игра лото. Перед игрой все бочонки стояли по порядку, потом их поместили в мешок и перемешали, но, так получилось, что все бочонки вытянули по порядку. Здесь явно было перемешивание, сами же трясли мешок с бочонками

                  Ну и контрольный пример. Массив из двух элементов, по комбинаторике-шмомбинаторике возможно два варианта, но по Вашей логике всегда будет только один вариант.
                  Ответить
                  • Наверное, Вы все-таки имели в виду "массив из четырех элементов".
                    По теме: действительно, исходный порядок тоже можно считать перемешанным. Но по логике программы нужно не "перемешать", а изменить порядок. Поэтому срач здесь неуместен.
                    Ответить
                    • Да, четырех. Сначала взял три, потом подумал, что маловато :)
                      Ответить
                  • > но по Вашей логике всегда будет только один вариант
                    но по Вашей логике должен быть только один вариант, но на самом деле будет два
                    Ответить
                  • У нас есть объект. Его состояние -- А. Нам нужно состояние Б. Не важно как выглядит А: отсортировано по убыванию/возрастанию, не отсортировано, отсортировано по скрытым параметрам, не попавшим в массив, а оставшимся в БД, например. Неважно. Нам надо получить состояние Б. И мы для этого используем shuffle. Взяв shuffle два раза -- мы получим состояние В.
                    Ответить
                    • shuffle не меняет состояние, он перемещает элементы в случайном порядке, т.е. берет случайный элемент, потом из оставшихся еще случайный и т.д. и вполне может выбрать элементы, так что порядок будет совпадать с первоначальным. Не верите мне, поверьте PHP
                      <?
                      $a = array(1,2,3);
                      
                      for ($i=0; $i<20; $i++) {
                      	$b = $a;
                      	shuffle($b);
                      	print implode('', $b)."\n";
                      }
                      ?>

                      Для чистоты эксперимента перемешиваем исходный массив. Из 10000 циклов вариант "123" выпадал около 1650, т.е. ~1/6 от 10000, что говорит о равномерности случайной выборки
                      Ответить
                      • Под состоянием я понимаю порядок следования элементов.
                        Ответить
                    • У тебя и у cfdev отсутствуют мозги так как:
                      сколько бы ты не делал shuffle, даже 100 раз ты все равно можешь вернутся в первое состояние(причем равновероятно на каждой из попыток)
                      3. под обязательное изменение состояния подошло бы что то вроде этого, но про это даже намека нет
                      $tmp = $array;
                      while($tmp === $array){
                      shuffle($array);
                      }
                      4. cfdev - сИди тупи дальше :)
                      5. Кстати отличный говнокод
                      Ответить
                  • квантовый говнокод!
                    Ответить
                • Да, что я перемешенный соглашусь, так как нет двух одинаковых ДНК (или очень малая вероятность, или если не близнецы)
                  Ответить
        • на самом деле так и есть=) строки берутся из базы с помощью запроса с ORDER BY RAND()
          Ответить
          • Ну тогда вообще эти строчки можно убирать.
            Ответить
    • PHP-шная мантра.
      Ответить
    • Перемешать, но не взбалтывать!!
      Ответить

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