ДействиеСценарий / Говнокод #7422 Ссылка на оригинал

0

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

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

Запостил: hyzhak hyzhak, (Updated )

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

  • В прошлые времена этот индус мог бы основать религию. Или, по крайней мере, стать святым.
    Ответить
  • 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. Естественно в нуле плотность распределения будет проседать.
                Ответить
                  • Спасибо за ссылку! Не знал про такой сервис. Там даже 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 железно уверен, что он будет "сползаться", вытягиваясь в какую-то дельта функцию. ну или он не может внятно сформулировать, в чём он уверен.
                                                    Ответить
                                                    • Вот к чему приводит непонимание теории вероятностей. А ведь задачу о блуждающей точке рассматривают в первом семестре изучения ТВ.
                                                      Ответить
                                                          • Мда... даже не знаю, как еще это объяснить... вы считаете соотношение выпадения нуля к сумме вероятностей выпадения всех остальных чисел, и, в таком случае, вы правы, но вы получаете бесполезную информацию. Я говорю, что чем дольше цикл, тем больше вероятность получить ноль по сравнению с любым другим вариантом. Во-первых, даже если мы не будем рассчитывать ничего, оба утверждения не взаимоисключающие, во-вторых, оба верные, если мы все-такип посчитаем...
                                                            Ответить
                                                            • Нет, вы таки ответьте на мой вопрос:

                                                              До сих пор ли вы считаете что при подбрасывании монетки вероятность исхода 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);
      Ответить
  • Глядя на простыню выше — да, тема теорвера среди программистов бессмертна.
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8