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

    +159

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    <?
    $arr = array(2,1,1,1,1);
    echo $arr[rand(0,count($arr)-1)];
    /*вероятность двойки 20%, 5 чисел = 100%, 1 число = 20%. Так и делается, ничего не говнокод.
    И в других языках по этому же принципу.
    */
    ?>

    Человек спросить, как сделать псевдорандом с вероятностью выпадения числа в 20 процентов. Вот что ему ответили.

    Запостил: timurkin, 12 Июня 2014

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

    • я не уверен что понимаю вопрос. из "ответа" мне тоже как-то нелегко выцедить что именно имелось ввиду: вероятность выпадания двойки и на самом деле 20%, единицы - 80%. правильно или не правильно - сложно сказать.

      но табличное задание вероятностей дело не новое и само по себе не говно.

      если мне надо нелинейные вероятности, я как правило мулю какую функцию (типично интерполяцией) которая выдает нужное мне распределение на [0,1) и применяю ее к drand48(). ну а дальше как обычно.
      Ответить
      • что такое нелинейная вероятность? У меня ВысМат для гуманитариев в универе была, и то лет 8 назад.
        Ответить
        • > нелинейная вероятность?

          рандом с нелинейным распределением вероятностей результата.

          в общем случае, рандом должен (и это есть качество хорошего ранодома) выдавать каждое из возможных значений с одинаковой вероятностью.

          одинаковые вероятности в каждой точке == график есть прямая линия == линейное распределение.

          нелинейное распределение: график есть не прямая линия, а кривая.
          Ответить
          • Нет, рандом бывает всякий. Тот, который выдает любое значение из заданого диапазона с равной вероятностью называется равномерным. Из популярных других рандомов: Гауса (описаный кривой Гауса, она же кривая Белла, она же нормальное распределение), другой популярный рандом: закон Ципфа так же известный как экспоненциальное распределение. Но это только маленькая часть, известных распределений есть очень много.
            С чем я да могу согласится с кодом из ОП, так это то, что для эмуляции выборки без повторений с небольшим диапазоном можно использовать массив / кучу / дерево, но гораздо универсальнее использовать гипер-геометрические формулы, т.как из них можно получить некоторые данные с меньшим усилием (типа вероятносетй, что желаемый результат окажется в каком-то диапазоне).
            Ответить
            • > она же кривая Белла
              т.е. bell curve так называется вовсе не потому, что похожа на колокол? о как
              > закон Ципфа так же известный как экспоненциальное распределение
              "работа лампы osram, так же известная, как электричество"
              Ответить
              • >>т.е. bell curve так называется вовсе не потому, что похожа на колокол? о как

                врет он все
                нет никакой кривой Белла
                Ответить
              • Хех, я действительно не знал почему bell curve так называется. Но по поводу Ципфа - тут все честно, это экспоненциальное распределение, иначе известное как power law, или Mathew's law. То, что Ципф упоминается в контексте естесственных языков, а power law в контексте экономики - просто случайность, с точки зрения формы кривой они относятся к одному классу.
                Ответить
                • >>Но по поводу Ципфа - тут все честно, это экспоненциальное распределение.

                  а чеж тогда р(к) = а/к? Экспоненту от гиперболы не отличаем?

                  >> Mathew's law

                  а можно коммунистическое название?
                  Ответить
                  • ну да, р(к) = а/к не совсем правильно, сумма /= 1, делить на интеграл нужно, бла бла бла, короче

                    р(к)/р(к+1) = a, a>1

                    все равно гипербола
                    Ответить
                  • > а можно коммунистическое название?
                    Законы Мэтью

                    http://www.kinopoisk.ru/film/722748/
                    Ответить
                    • Ответить
                    • может все таки эффект Матфея? типа "имеющему дастся и приумножится, а у неимеющего отнимется и то, что имеет". но как это к матстату относиться? а Ципфа относиться к распределениям парето. с натяжкой. все таки Ципфа - это скорее статестический феномен
                      Ответить
                  • ХЗ. Меня коммунистические названия не интересуют.
                    Zipf law - это вообще евристика, "экспоненциальная" тут не относится к тому, как получены результаты, а на что похожа кривая. Точно так же, как можно, например, с помощью косинуса (если правильно помню, то (1 - cos(x)) / 2pi) бриблизительно описать нормальную кривую.
                    Другие примеры: распределение Галтона, распределение Парито.
                    Ответить
                    • >>Меня коммунистические названия не интересуют.
                      >>Парито.

                      Ну так и че ж ты тут делаешь? Околесицу несешь, в показаниях путаешься.

                      >> а на что похожа кривая.
                      я так вижу
                      Ответить
                      • Подожди, может ты мне расскажешь, что делать? Куда идти, о чем думать. Ты ж знаешь!
                        Ответить
                        • что хочешь, то и делай.
                          а я лишь пешка в руках великого математического аппарата вселенной.
                          Ответить
                    • > евристика
                      евреи таки повсюду
                      Ответить
                      • Идет Рабинович по лесу и видит НЛО, а рядом маленький зеленый инопланетянин. Рабинович:
                        - Здгавствуйте, догогой пгедставитель внеземной цивилизации!
                        Инопланетянин:
                        - Ни фига себе, и здесь они!
                        Ответить
                        • Сын медведь спрашивает у папы:
                          - Папа, а кто у нас в роду был?
                          - ну белые были, бурые. Еврей один был. Куда ж без них...
                          Ответить
                          • cleaned
                            Ответить
                            • cleaned
                              Ответить
                              • - Доктор, мне не дают уснуть оценки моих комментариев!
                                - А вы не чешите их, и всё пройдет.
                                Ответить
                                • cleaned
                                  Ответить
                                  • возьми не указатель, а boost::weak_ptr
                                    Ответить
                                    • Ему в дельфи наверное надо
                                      Ответить
                                      • Или, чтобы сказать "Кресты - говно, не то что дельфи".
                                        Ответить
                                        • можно подумать, что в дельфи изобрели песочницу, введя очередной indirect слой для доступа к памяти (сколько их там уже и без этого вымышленного слоя?)
                                          Ответить
                                      • Ну тогда остается скрупулезно пихать nil в этот указатель при освобождении памяти. И если там nil - значит он никуда не указывает ;)
                                        Ответить
                                        • Если юзать объекты, то деструктор за нас зануляет (во всяком случае в fpc).
                                          http://ideone.com/lstLho

                                          Ну и можно среди выделенных блоков памяти поискать, если настолько важно.
                                          Ответить
                                          • т.е. дельфи тормозит даже при удалении объекта
                                            только неясно как это решает проблему
                                            кто может помешать разместить другой, чужой объект по этому же адресу, в интервале между удалением нашего и попыткой обращения по сохраненному указателю?
                                            Ответить
                                            • Никак, но оператор is вернет тип объекта, так что к неправильному типу мы не обратимся. А к неправильному объекту того же типа - это уж пусть программа контролирует.
                                              Ответить
                                              • > оператор is вернет тип объекта
                                                т.е. ты предлагаешь перед каждым разыменованием указателя уточнять, какого он там типа?
                                                или это делается за нас, независимо, хотим ли мы этого
                                                Ответить
                                                • Я отвечаю на исходный вопрос - как определить нормальный ли указатель. А вашего вопроса я не слышал.
                                                  Ответить
                                                  • классическая проблема многопоточного приложения
                                                    в одном треде объект создается, указатель/ссылка на него передается другому треду
                                                    когда первый тред решает объект уничтожить, второй тред (и => приложение) не должен от этого пострадать, когда он решится обратиться к этому объекту

                                                    сделать это можно:
                                                    1) разрешив первому треду лишь уменьшить счетчик ссылок на объекте (и автоуничтожить объект, когда этот счетчик действительно станет равным нулю),
                                                    2) разрешив первому треду взаправду уничтожить объект, но тогда обеспечив второму треду достоверный механизм проверки, что именно переданный ему объект до сих пор жив или уже мертв, и, если жив, останется гарантированно жить, пока второй тред его реально использует некоторое время,
                                                    3) сборщик мусора (что, фактически, обобщение варианта 1)

                                                    так что же предлагает дельфи?
                                                    надеяться на is, as, his, зануление деструктором и Вирта?

                                                    а насколько это вообще потокобезопасно - проверить по косвенным признакам, что объект, предположительно, свой и хороший, и начать с ним работу, в то время, как первый тред его всё же убьет?
                                                    Ответить
                                                    • >так что же предлагает дельфи?
                                                      надеяться на is, as, his, зануление деструктором и Вирта?

                                                      Тут все просто.
                                                      1. Берем
                                                      2. Реализуем.
                                                      Хоть со счетчиком ссылок, хоть без. Нужна потокобезопасность? Ну так мютекс добавить, и в деструкторе его лочить. Или спинлок.
                                                      Ответить
                                                      • > Ну так мютекс добавить, и в деструкторе его лочить
                                                        ох жесткачь
                                                        и подвесить тред 1

                                                        теперь мне понятно, почему великолепный дельфиний TOAD за много денег ТАК тормозит и через раз падает при попытке восстановления сессии с ораклом

                                                        > Тут все просто.
                                                        ну т.е. ничего не предлагает, вообще
                                                        поэтому-то ни один дельфин и не суется в многопоточность
                                                        на 8-ядерных процах выжимает производительность селерона
                                                        зато его приложение заработает на Windows 95
                                                        Ответить
                                                        • > поэтому-то ни один дельфин и не суется в многопоточность
                                                          Да ну? Вон Стертор сколько примеров нам накидал...
                                                          Ответить
                                          • > то деструктор за нас зануляет
                                            Вот только деструктор в делфи сам не вызовется... RAII то только на "интерфейсах" и строках работает.
                                            Ответить
                                            • >Вот только деструктор в делфи сам не вызовется...
                                              А если деструктор не вызвался, значит и объект в порядке, никаких проблем.
                                              Ответить
                                              • Но зачем защищать этот пережиток прошлого?
                                                Ответить
                • > Но по поводу Ципфа - тут все честно, это экспоненциальное распределение
                  я неспроста сделал свою ремарку
                  не честно
                  закон Ципфа - дискретный на конечном множестве
                  экспоненциальное распределение - непрерывное на [0, +inf)
                  непрерывный родственник распределения Ципфа - закон Парето

                  экспоненциальное распределение принадлежит семейству экспоненциальных распределений (ты, видимо, подразумевал именно семейство ), и Парето войдет это семейство, только если зафиксировать его нижнюю границу

                  слишком много приходится делать обобщений и допущений, чтобы взять и набросить "закон Ципфа, широко известный как экспоненциальное распределение"
                  но спасибо, пришлось повспоминать материал тервера, забытый много лет назад
                  Ответить
            • >> закон Ципфа так же известный как экспоненциальное распределение

              Закон Ципфа — закономерность распределения частоты слов естественного языка

              не надо ляля

              >>она же кривая Белла

              ????Gaussian bell curve
              колоколообразная кривая Гаусса
              Ответить
        • нет такого термина. не равномерное распределение видимо имелось в виду
          Ответить
        • Что, скорее всего имел в виду автор, так это биномиальное распределение 1:4, которое легко эмулируется равномерным распределением, если мы будем, например, считать все результаты в диапазоне min...1/5 как относящиеся к первой "ячейке", а 1/5...max - ко второй ячейке, т.е, например if random() < 0.2 вполне себе хороше сэмулирует нужное нам распределение.
          Ответить
    • нормальный способ, в общем-то
      Ответить
      • > нормальный способ, в общем-то
        Ну да, если значений не так много. А для большого количества я делал массив, в котором лежали P(x <= i) (забыл, как они по-умному называются) и искал в нем случайное число двоичным поиском. Примерно так:
        int prob[] = { 0, 2, 5, 7, 8 }; // 1/9 - 0, 2/9 - 1, 3/9 - 3, 2/9 - 2, 1/9 - 1
        int x = std::lower_bound(prob, prob + 5, rnd(9));
        Ответить
        • Это называется функция распределения случайной величины
          Ответить

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