1. ActionScript / Говнокод #7422

    −109

    1. 1
    Math.pow(-1,Math.round(1+Math.random()))*Math.random() * x

    случайное число в диапазоне [-x, x].

    Запостил: hyzhak, 02 Августа 2011

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

    • такое можно и в раздел js запостить)
      Ответить
    • В прошлые времена этот индус мог бы основать религию. Или, по крайней мере, стать святым.
      Ответить
    • Нормальный код.
      Ответить
      • Нормальный, это такой, например:
        Math.random() * 2 * x - x;
        .
        Ответить
        • лучше так:
          2*х*(Math.random() - 0.5) ;
          Ответить
          • тогда уже x*(2*Math.random()-1)
            Ответить
            • а чем лучше? Число операций умножения/сложения одинаковое. Как и читабельность.
              Ответить
        • Сарказм же. Или обрамлять тегом надо?
          Ответить
          • все мы горазды опосля исправляться
            Ответить
    • r = 0;
      for(i = 0; i < x; ++i){
      if(Math.round(Math.random())){
      ++r;
      }
      else{
      --r;
      }
      }


      И можно обойтись без возведения в степень.
      Ответить
      • и каково же распределение?
        Ответить
        • с каждой итерацией всё случайнее и случайнее
          Ответить
          • как раз таки наоборот :)
            т.е., чем больше x, тем выше вероятность, что результат будет 0.
            Ответить
            • Не силён в экшн скрипте, но я думаю что вероятность выпадения нуля будет:
              $\frac{1}{2^r}{r \choose r/2}$
              для чётных r, и она будет уменьшаться с увеличением r.
              Ответить
              • как увидеть формулу?
                Ответить
              • Что-то вы тут очень замысловатое придумали - все проще на самом деле... чем больше раз мы подбрасываем монетку, тем ближе отношение орел/решка к 1/1, соответсвенно, количество раз когда программа зайдет в обе ветки if/else будет примерно равно, следовательно, чем больше итераций, тем вероятнее получить ноль.
                Вряд ли это имеет какое-то отношение к AS.
                Ответить
                • Про AS была шутка ; )
                  Но давайте посмотрим на пример, допустим подбрасываем монетку r раз (естественно рассматриваем только чётные значения).
                  Надеюсь очевидно что общее число возможных исходов = 2^r.
                  Теперь обозначим решку 1, а орла 0. И будем записывать последовательность как ряд нулей и единиц.

                  Для случая r = 2 мы имеем 4 варианта:
                  00 (орёл,орёл)
                  01 (орёл,решка)
                  10 (решка,орёл)
                  11 (решка,решка)
                  только в двух из них количество орлов и решек совпадает. По известной формуле P(2) = M/N = 2/4 = 0.5

                  Теперь пусть r = 4, получаем:
                  0000
                  0001
                  0010
                  ...
                  1111
                  Не трудно убедится, что число вариантов, когда выпало одинаковое количество орлов и решек - 6. Итого, P(4) = N/M = 6/16 = 3/8.

                  P(4) < P(2). Вероятность уменьшается. И решения совпадает с моей формулой. (нерспарсившим формулу говнам TeX в помощ)

                  В этом же можно убедиться представив себе кривую плотности распределения, с увеличением r кривая будет всё шире и шире. А площадь её как ни крути = 1. Естественно в нуле плотность распределения будет проседать.
                  Ответить
                  • http://texify.com/$\frac{1}{2^r}{r \choose r/2}$
                    так написать сложно было?
                    Ответить
                    • Спасибо за ссылку! Не знал про такой сервис. Там даже URL сгенерированных картинок содержит формулу. Если нет никаких хитрых антихотлинкингов, то его можно использовать для сайта.
                      Ответить
                  • Вы не поняли мой предыдущий ответ - какая разница, какой пологой или крутой будет кривая, если ее пик однозначно будет в нуле - из всех возможных вариантов ноль, по-прежнему, самый вероятный, и тем вероятнее, чем больше раз мы пробуем, а вы вообще не то считаете... даже если вероятность выпадения нуля будет 0.1%, вероятность всех других исходов будет как минимум 0.05% или меньше. Так что без разницы какой шанс выпадения нуля по сравнению с общими вариантами, главное, что относительно любого другого этот шанс выше.

                    ЗЫ. Вам противопоказано играть в азартные игры :)
                    Ответить
                  • Да, еще, такой момент, почти с полной уверенностью можно сказать, что числа в диапазоне -x .. x * -0.5 и x * 0.5 .. x не будет почти никогда, и чем больше x, тем необходимое K в -x .. x * -K и x * K .. x меньше.
                    Ответить
                  • показать все, что скрытоСорри, тройной пост :) Я просто не мог придумать, как правильно указать на заблуждение. Проблема ваших рассчетов заключается в том, что вы предполагаете, что результат типа 0000000001 и 0101010101 (или любой похожий по количеству нулей и единиц) будут встречатся одинаково часто. В то время как последовательно подбрасывая монетку, шансы последовательно выбросить одну и ту же сторону уменьшаются.
                    Ответить
                    • Предлагаю продолжить спор в этой ветке. Проблема в том, что вы либо не учили тервер, либо его забыли. Я посоветую вам освежить память: http://ru.wikipedia.org/wiki/Независимость_(теория_вероятностей)

                      > типа 0000000001 и 0101010101 (или любой похожий по количеству нулей и единиц) будут встречатся одинаково часто.

                      Два события подбрасывания монетки НЕЗАВИСИМЫ друг от друга. Первый раз подбрасываем - вероятность получить орла = 0.5, второй раз подбрасываем вероятность получить орла = 0.5. Вероятность получить 2 орлов подряд = 0.5 * 0.5.
                      Итого:
                      P(01) = 0.25
                      P(10) = 0.25
                      P(11) = 0.25
                      P(11) = 0.25
                      В сумме единица.

                      С вами сложно спорить, вы оперируется недоказанными умозаключениями. Прежде чем будете писать ответ сходите по этой ссылке http://www.random.org/coins/?num=2&cur=20-novelty.decision-maker и подкиньте 2 монеты не менее 50 раз. И напишите сюда результат.
                      Ответить
                      • Я вставлю своё веское слово:
                        .
                                                           _,-----._____
                                                       _,-'      .:::.  `-._
                                                      /                     `-.
                                                     /                       .::.
                                                    /            ______       .::\
                                                ___|        __.-'\ .|:.`--._  .:::\
                                         ___,--'   /     _,'    .:\ |: /    `-.::::\
                                        /   `-.    |   .'       .::\| /       .`:::|
                                       _|      `.  | .'          .::)/         ::\:/
                                  _,--(`\        \ |/           .::/ ).       .:::V
                                 / .:._\_\.   ,--. (            .::| /.       .:::|
                                /.:_,-'    \_|    \_|           .::|/.        .:::/
                                \ <  | \      \   .:|           .::||.        .::/
                                { <   \/  , /\ \   :\           .::|/.       .::/
                                |  <_ / \ ` \,-/\.   |         .:::/.       .:::/
                                \  \:`+----'::/  `.  |        ..:::|.      .:::/
                                | ..  `.:::::/     \_|        ..::|:.      .::/
                                 \ :.   <:::/        \        ..::|:.      .:/
                                  \_ .  <:/           |       ..::|.       ::/
                                    \__  /            |        .::|.      .:/
                                       `'             \         ::|.    .::/
                        Ответить
                      • \      .:|              \      .\
                                                    |     .:/                \      .\
                                                    |     .:|                 \       \
                                                    |    .:/                   \      .\
                                                    |   .:/                     \      .\
                                                    |   .:|                      \.    .:\,
                                                    |   ::|                       \.   _//.`.
                                                    /  .::\                       |:._//   .:\
                                                   /  _.:::\                      L_' |    .:)
                                                   L='``:::/                      |  || ,-'.:|
                                                  //  .::\|                       \==\\/_   :|
                                                 /     .::|                      /|__////\  :|
                                                 | _,-._ :/                     /\\__///  \ :|
                                                 \/   .://|                     \     /    \:|
                                                /\\   :/,'|                      \___/     |_|
                                                |/#\  :|,'|
                                                |/  \ :|\,/
                                                 /   | :|
                                                     |_:|
                        Ответить
                      • Да в том-то все и дело, что нет, а вы в упор этого не замечаете. Я специально выделил курсивом - последовательные т.е. То, что вы написали выше просто не верно. Каждое независимое подбрасывание - да, вероятность 50%, каждое следующее - да, вероятность, опять же, 50%, но последовательно выбросить ту же сторону, это уже в 2 раза вероятность ниже, трижды выбросить одну и ту же сторону - в четрыре раза менее вероятно и т.д. Попробуйте приведенный в обсуждении алгоритм с x = 100, и запустите программу 100000 раз - вы не получите 100 в результате, практически гарантировано, все значения, которые вы будете получать будут где-то в пределах +-10.
                        Ответить
                      • Собственно:
                        (defun bogus-random (x)
                          (loop for i from 0 upto x
                               with r = 0
                               do (setf r (funcall (nth (random 2) '(1+ 1-)) r))
                               finally (return r)))
                        
                        
                        ;; less then ten: 66621
                        ;; less then twenty: 29231
                        ;; less then fifty: 4149
                        ;; others: 0
                        
                        ;; total: 100001
                        (loop for i from 0 upto 100000
                             for bogus-result = (bogus-random 100)
                             with less-then-ten = 0
                             with less-then-twenty = 0
                             with less-then-fifty = 0
                             with others = 0
                             do (cond
                        	  ((< (abs bogus-result) 10)
                        	   (setf less-then-ten (1+ less-then-ten)))
                        	  ((< (abs bogus-result) 20)
                        	   (setf less-then-twenty (1+ less-then-twenty)))
                        	  ((< (abs bogus-result) 50)
                        	   (setf less-then-fifty (1+ less-then-fifty)))
                        	  (t (setf others (1+ others))))
                             finally (format t "less then ten: ~a
                        ~&less then twenty: ~a
                        ~&less then fifty: ~a
                        ~&others: ~a~&
                        ~&total: ~a~&" less-then-ten less-then-twenty less-then-fifty others 
                        (+ less-then-ten less-then-twenty less-then-fifty others)))
                        Ответить
                        • Уж извините в лиспе не силён, я вот на крестах наговнякал:

                          #include <ctime>
                          #include <cstdlib>
                          #include <iostream>
                          #include <map>
                          
                          using namespace std;
                          
                          int calc_r(int N)
                          {
                            int r = 0;
                            for(int i = 0; i < N; ++i)
                              {
                                int sign = rand() % 2;
                                if(sign)
                          	  ++r;
                                else
                          	  --r;
                              }
                            return r;
                          }
                          
                          int main ()
                          {
                            srand(time(NULL));
                            int nTests = 1000; // number of tests
                          
                            // result here in form <number of moves (++r or --r), 
                            //                      number of zero results>
                            map<int, int> result; 
                          
                            for(int N = 2; N < 50; N+=2)
                              {
                                map<int, int> distribution;
                                for(int j = 0; j < nTests; ++j)
                          	{
                          	  int r = calc_r(N);
                          	  distribution[r]++;
                          	}
                                result[N] = distribution[0];
                              }
                          
                            for(map<int, int>::const_iterator it = result.begin(); it != result.end(); ++it)
                              cout << "p[" << it->first << "] = " << it->second << endl;
                          }


                          Чем выше N тем реже выпадает ноль:
                          p[2] = 482
                          p[4] = 393
                          p[6] = 307
                          p[8] = 267
                          p[10] = 252
                          p[12] = 225
                          p[14] = 220
                          p[16] = 190
                          Ответить
                          • А не боишся, что С++ тебя поимеет? Самое время начинать учить лисп.
                            Ответить
                          • Ну и поставил я коммон лисп. выхлоп вашей программы:
                            less then ten: 66641
                            less then twenty: 29203
                            less then fifty: 4157
                            others: 0

                            total: 100001

                            Что это доказывает? Чем помогают три диапазона? У вас там даже сравнения нет.
                            Посчитайте сколько раз выпадает ноль при bogus-random от 2 до 50 чтобы результат был в таком же формате как у меня в плюсах
                            Ответить
                            • Да вы опять совсем не то считаете... ну я даже не знаю как это еще объяснтить... если 0 выпал 2 раза из 4 или 7 раз из 16 - это говорит о том, что вероятность получить ноль увеличивается, т.как по сравнению с остальными вариантами в первом случае было 50%, 25%, 25% для каждого из возможных результатов, во втором случае - 45% для нуля и следующий за ним часто встречающийся результат - 20% (грубо говоря, я в уме не посчитаю), но таких вариантов будет всего два, остальные будут еще реже встречаться, т.е. опять же, грубо говоря, 10% и т.д. Но кроме того, доля нулей будет уменьшаться медленнее, чем доля других чисел, при чем тем медленнее, чем больше модуль числа.

                              Диапазоны для того, чтобы показать общую тенденцию. А про сравнение я не понял - что с чем сравнивать? Если хотите, можете поменять проверку на что-нибудь такое:
                              (loop for i from 0 upto 100000
                                   for bogus-result = (bogus-random 99)
                                   with zeros = 0
                                   with less-then-ten = 0
                                   with less-then-twenty = 0
                                   with less-then-fifty = 0
                                   with others = 0
                                   do (cond
                              	  ((zerop bogus-result) (setf zeros (1+ zeros)))
                              	  ((< (abs bogus-result) 10)
                              	   (setf less-then-ten (1+ less-then-ten)))
                              	  ((< (abs bogus-result) 20)
                              	   (setf less-then-twenty (1+ less-then-twenty)))
                              	  ((< (abs bogus-result) 50)
                              	   (setf less-then-fifty (1+ less-then-fifty)))
                              	  (t (setf others (1+ others))))
                                   finally (format t "zeros: ~a
                              ~&less then ten: ~a
                              ~&less then twenty: ~a
                              ~&less then fifty: ~a
                              ~&others: ~a~&
                              ~&total: ~a~&" zeros less-then-ten less-then-twenty less-then-fifty others 
                              (+ zeros less-then-ten less-then-twenty less-then-fifty others)))

                              Если после того, что вы увидите, что нулей в полученых результатах в общем больше, чем любых результатов больше x/4 - то я тогда даже не знаю...
                              Ответить
                              • > если 0 выпал 2 раза из 4 или 7 раз из 16

                                во первых не 7, а 6 из 16. Но даже если 7 из шестнадцати, формула расчёта вероятности из педовикии:

                                Согласно определению П. Лапласа, мерой вероятности называется дробь, числитель которой есть число всех благоприятных
                                случаев, а знаменатель — число всех равновозможных случаев

                                Разбираем по буквам: 2 из 4, 7 из 16. В первом случае вероятность получить ноль = 2/4. Во втором = 7/16. 0.5 больше чем 0.44 (тут вы надеюсь не будуте спорить). Вероятность для первого случая больше чем для второго. Это следует из определения вероятности.

                                Мне тоже не понятно как с вами дальше разговаривать. Я привожу формулы и определения а вы прлогаете что "увидеть".
                                Ответить
                                • Больше чего? С чем вы сравниваете?
                                  Ответить
                                  • Я сравниваю 2 вероятности друг с другом. Как вы сами написали:

                                    > В первом случае было 50%.... во втором случае - 45% для нуля.

                                    45% меньше чем 50%. Про это я и говорил, и даже привёл формулу, по которой вероятность выпадения нуля можно посчитать. И всех остальных чисел тоже если её немного обобщить.

                                    Про другие числа я не говорил ничего. Я согласен с тем что 0 самый вероятный результат при любом раскладе. Но вероятность получения нуля уменьшается. 50% для 2 итераций. 37.5% для четырёх, 31.25% для 6.
                                    Ответить
                                    • Уменьшается если срванивать с суммой всех остальных, естесственно, но увеличивается если сравнивать с любым другим вариантом, либо "идеальным" вариантом т.е. 1 / x, где x - все технически возможные варианты. Я не вижу практической ценности сравнивать со "всеми остальными вместе" т.как это нам ни о чем не говорит - это как сравнивать оценки ученика с сумой оценок всех остальных учеников...
                                      Ответить
                                      • Уменьшается если сравнивать с вероятностью не всех остальных, а вообще ВСЕХ исходов, то есть с единицей. Так делают в теории вероятности, которая видимо прошла мимо вас. Вот вы и выдаёте перлы, что

                                        > чем больше итераций, тем вероятнее получить ноль
                                        > доля нулей будет уменьшаться медленнее, чем доля других чисел,

                                        Эти два утверждения противоречат друг другу просто по ОПРЕДЕЛЕНИЮ вероятности.
                                        Ответить
                                        • Тут теория вероятности давно уже ни при чем. Смысл в том, что вы считаете (т.е. подсчитываете, а не думаете) не то, что утверждалось. Т.о. ваши доводы бессмысленны, т.как доказывают что-то другое, что я не утверждал и вообще не имел намерения обсуждать. Но вы считаете, что это одно и тоже, или я не знаю по какой причине продолжаете спорить...
                                          Ответить
                                          • > Тут теория вероятности давно уже ни при чем.

                                            Мы спорим о вероятности выпадения 0 при изменении параметра алгоритма. Вы утверждаете что при расчёте вероятности события теория вероятности не причём?

                                            Не имели намерения обсуждать -- не обсуждайте, оставьте свои глупости при себе.
                                            Ответить
                                            • Хех... я говорю глупости, а вы складываете апельсины с километрами... на том и порешим.
                                              Ответить
                                              • реквестую километр свинины, чтобы разобраться в апельсинах
                                                стохастический подход - неверен
                                                Ответить
                                              • Порешим на том, что вы не знаете что такое вероятность и видите за моими словами одному вам известные вещи.
                                                Ответить
                                              • я вот как бы тупо взял и проверил вас обоих :) http://pastie.org/2446119

                                                macGovno разумеется прав насчёт уменьшения вероятности 0лей.

                                                а вот wvxvw не прав насчёт того, что вероятность 0лей растёт по отношению к вероятностям прочих значений - всё строго наоборот. единственное, в чём wvxvw прав, так это в том, что 0ли выпадают чаще (но это преимущество падает с ростом x).
                                                Ответить
                                                • Ма-ла-дец! И вы тоже сравнили вероятность выпадения нуля с сумой вероятностей выпадения всех остальных вариантов - и получили правельный, но никому не нужный результат.
                                                  Ответить
                                                  • авотхуй, надо читать обе половины кода прежде чем отвечать.

                                                    п.с. но если вдруг совершенно все в этом топике неправильно понимают твои утверждения, велкам отредактировать код как надо (лисп неосилил)
                                                    Ответить
                                                  • 2 wvxvw:

                                                    > Проблема ваших рассчетов заключается в том, что вы предполагаете, что результат типа 0000000001 и 0101010101 (или любой похожий по количеству нулей и единиц) будут встречатся одинаково часто.

                                                    Вы лучше скажите признаёте ли вы ошибочность данного высказывания?
                                                    Ответить
                                                    • Разумеется, это бред. Похоже, wvxvw не понимает, что такое "эксперимент": пространство исходов, сигма-алгебра событий и т.п. У него какие-то собственные, интуитивные представления.
                                                      Ответить
                                                • Ну вы даёте, друзья... Вчитался, наконец, в топик (раньше лень было - много букаф). Это же задача о блуждающей точке при p=q=1/2. Погуглите и успокойтесь. Вероятность нахождения в каждой конкретной точке после N-ного шага мала и зависит от N. Вероятность нахождения точки после N шагов в нуле действительно больше, чем в вероятность нахождения её в какой-то другой конкретной точке (матожидание, ёпт), но она падает с ростом N, ведь растёт пространство состояний. Это же элементарно, а вы тут код какой-то пишите и флэйм развели.
                                                  Ответить
                                                  • А если нарисовать график изменения распределения вероятностей и анимировать его (пусть N будет временем), вы, скорее всего, увидите что-то похожее расползающийся и спадающий колокольчик Гаусса.
                                                    Ответить
                                                    • так отож, расползающийся. а wvxvw железно уверен, что он будет "сползаться", вытягиваясь в какую-то дельта функцию. ну или он не может внятно сформулировать, в чём он уверен.
                                                      Ответить
                                                      • Вот к чему приводит непонимание теории вероятностей. А ведь задачу о блуждающей точке рассматривают в первом семестре изучения ТВ.
                                                        Ответить
                                                        • 2 roman-kashitsyn:
                                                          Блядь, об этом я и говорил в посте http://govnokod.ru/7422#comment100782 . Там и про кривую Гаусса. Кто же виноват, что некоторые товарищи упоротые?
                                                          Ответить
                                                          • Я был на вашей стороне )
                                                            Ответить
                                                            • Мда... даже не знаю, как еще это объяснить... вы считаете соотношение выпадения нуля к сумме вероятностей выпадения всех остальных чисел, и, в таком случае, вы правы, но вы получаете бесполезную информацию. Я говорю, что чем дольше цикл, тем больше вероятность получить ноль по сравнению с любым другим вариантом. Во-первых, даже если мы не будем рассчитывать ничего, оба утверждения не взаимоисключающие, во-вторых, оба верные, если мы все-такип посчитаем...
                                                              Ответить
                                                              • Нет, вы таки ответьте на мой вопрос:

                                                                До сих пор ли вы считаете что при подбрасывании монетки вероятность исхода 0000000001 не равна вероятности исхода 0101010101 ?
                                                                Ответить
                                                                • Для людей с плохим зрением и рассеяным склерозом было выделено "последовательное" подбрасывание.
                                                                  Ответить
                                                                  • Сказали чушь а теперь отмазываетесь. Естественно подбрасывание последовательное. Повторю вопрос ещё раз:

                                                                    До сих пор ли вы считаете что при последовательном подбрасывании монетки вероятность исхода 0000000001 (9 орлов подряд, затем решка) не равна вероятности исхода 0101010101 (орёл, решка и так 6 раз)?
                                                                    Ответить
                                                              • Я не знаю, на основании чего вы сделали такой вывод. Я честно посчитал вероятности (биномиальное распределение). По моим расчётам отношение вероятности выпадения нуля к вероятности выпадения двойки (для чётных N) стремится к единице при N стремящемся к бесконечности.
                                                                Ответить
                                                                • Хм... посчитал... да, вы правы. Хех, вот так вот, век живи, век учись...
                                                                  Ответить
                                                                  • да не ужто, я уже начал думать что вы просто такой странный тролль
                                                                    Ответить
                          • Извините и вы меня за ответ на три сообщения.

                            Но если мы возьмём ваше замечательную программу и заменим в ней
                            do (cond
                            	  ((< (abs bogus-result) 10)
                            	   (setf less-then-ten (1+ less-then-ten)))
                            	  ((< (abs bogus-result) 20)


                            на

                            do (cond
                            	  ((<= (abs bogus-result) 1)
                            	   (setf less-then-one (1+ less-then-one)))
                            	  ((< (abs bogus-result) 20)


                            то получим для
                            (bogus-random 10) less then one: 45264

                            (bogus-random 50) less then one: 22044

                            (bogus-random 100) less then one: 15731

                            То есть при увеличении числа итераций 0 выпадает реже, что в точности соответствует моему первоначальному заявлению.
                            Ответить
                            • Реже чем что? Вы не можете использовать относительные величины не говоря к чему они относятся. Какая разница, как именно делать выборку, нет в ней ничего замечательного, она просто демонстрирует, что чем больше итераций, тем вероятнее получить ноль. Т.как из четырех возможных ответов разница в вероятности получить ноль и другое число - половина, а из 16 разница между нулем и вторым лучшим вариантом больше половины. Я вообще не понимаю, как это может быть не очевидно...
                              Ответить
                    • Вот вроде и умный человек, а глупость полную сказали.
                      Ответить
                  • "Естественно в нуле плотность распределения будет проседать" вообще говоря нифига не естественно (см напр дельтафункцию) но в данном случае таки проседает
                    Ответить
            • кэп, это был сарказм :-Р
              Ответить
        • Распределение зависит.
          Ответить
    • Красивый код. Сразу виден математический склад ума.
      Ответить
      • Горе от ума ;)

        Особенно забавным был тот факт, что тот же человек чуть ниже, вполне резонно написал привычную конструкцию:
        2*х*(Math.random() - 0.5);
        Ответить
    • Глядя на простыню выше — да, тема теорвера среди программистов бессмертна.
      Ответить

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