Блог им. Kapeks

Рэндом генерация при тестировании жизненных стратегий, короче трёп за жизнь (научная статья)

    • 31 июля 2019, 00:59
    • |
    • Kapeks
  • Еще
Автор: Я.

Эбстракт


Здоровеньки булы, пацаны, как гритса!
Предупреждаю, из этой статьи вы узнаете Истину, но она не сделает вас Свободными. За Свободой к Бахтиярову, а здесь только тотальная обусловленность и Правда Жизни.
Итак, что мы имеем на планете Земля? Маск продолжает клепать свою марсианскую ракету, брокерня забирать у вас деньги, а святой Путин заботиться о Расеюшке. Всё идёт своим чередом прямиком к третьей мировой, которая неизбежна, как коммунизм в мечтах Ивана Ефремова. А пока не началось, я расскажу вам, куда двигать, чтобы просирание вашей никчёмной жизни происходило с особенным смыслом. Со времён царя Соломона известно, что во многой мудрости — много печали, и кто умножает познания, умножает скорбь. Этим мы и займёмся. К делу.

Постановка задачи



Задумывались ли вы когда нибудь, как далеко можно уйти в жизни? Допустим, если повезёт, вы проживёте ещё 40 лет и будете делать один маленький шаг в день, ну или один большой в год. Где вы окажетесь через 40 лет? Теоретически, если двигать пердячим паром всё врямя в одну сторону, то ваш путь будет выглядеть, как стрела, упирающаяся в надгробный камушек. Но то теория, а на практике никто по прямой не ходит. Путь большинства людишек напоминает случайные блуждания броуновской частицы в Великих просторах Вселенной (рис.1).

Рис.1 Universum
Рис.1. Вселенная и Путь Человека.


Путь 2 тоже упирается в гробовой камень, только маленький, он на картинке не показан.

Ладно, изучим как далеко можно уйти в обоих случаях.

1. Первый случай, линейного движения, абсолютно нереален, но наиболее прост для оценки: 40 лет, 40 больших шагов, длина вектора 40 шагов и конец.

2. Второй случай — это сосика Винера — ваша жизнь. Математическая теория случайного блуждания неплохо проработана (см. например Спицер Ф. Принципы случайного блуждания, М. Мир, 1969, 471 с., — я сам её не читал, пацаны, поэтому рекомендовать не могу, но если вы прочтёте, расскажите потом, про что там).

Ясно одно, Теория — это для ботанов. Наш рабочий метод — Эксперимент. Лучше всего было бы, конечно, прожить жизнь хотя бы миллион раз, измерить пройденное расстояние, навести статистику, опубликоваться в Нэйче, получить грант на исследование ещё ста миллионов жизней и дальше ничего не делать, один хер конец один. Но это долго. Нам надо получить результат побыстрее, поскольку эволюция не ждёт, надо ещё успеть оплодотворить максимальное кол-во самок, а пока в Нэйче опубликуешься уже стоять не будет, там всё схвачено, но не нами. Поэтому будем использовать другой подход. Берём Microsoft Visual C++ Express (он халявный), качаем библиотеки OpenGL, FreeGLUT, ACML (всё халява), пишем симулятор жизни, прогоняем мильён раз и дело с концом. Бинго!

Симуляция Жизни


Пацаны, я вам так скажу, это только кажется, что симулировать Жизнь человека сложно. На самом деле, вся симуляция укладывается в 7(семь!) строчек кода:
switch (dir)
    {
        case 0: pos[i].x += step; break;
        case 1: pos[i].y += step; break;
        case 2: pos[i].x -= step; break;
        case 3: pos[i].y -= step; break;
    }
dir — это направление, а pos[] — ваша жизненная координата. Остальное — техника,  надо повыделять память, задать начальные условия, запустить циклы, сгенирировать рандомно направление dir, подсчитать дистанцию, навести статистику, визуализировать людишек графически через OpenGL, сохранить и обработать результаты и т.д. Короче, рутина, 95-и процентам из вас недоступная, впрочем. Поэтому специально для вас, простого народа от сохи, я записал видеоролик про вашу жизнь. Каждый человечек на видео — отдельная точка и жизнь его подчиняется случаю.
Куда пойти, куда податься? Куда кривая жизни занесёт? Куда генератор случайных чисел скажет — туда и занесёт. Сначала все точки (людишки) случайно распределены в отцентрированном квадрате 40 на 40, затем начинают двигаться по Жизни. В любом случае, шаг будет один и тот же = 1(единица), а вот направление… ну тут как повезёт.

37 секунд красоты:



Поглядев на этот шедевр, я подумал: «Шо за херня?».
Откуда узоры? Людишки — толпа баранов, которая должна лениво разбредаться во все стороны, воплощая в жизнь идею винеровского процесса.
Поигравшись с числом людишек, я впрочем, быстро смекнул, шо узоры — не настоящие. Подделка это, пацаны. Рандом палёный. В смысле, функция генерации случайных чисел rand() из стандартной Си-библиотеки math.h оказалась голимой нерандомной хернёй, абсолютно непригодной для симуляции Жизни. На этом видео жизнь 400 тыщ людишек — всего лишь средний город. Период повторения оказался слишком маленький, что мы и видим в виде калейдоскопа. Так рождаются научные артефакты, пацаны. Запоминайте. Сколько дисеров, на подобном  артефактном шлаке было сделано — одному ВАК известно...

Ладно, подумал, я. Придётся генерировать вашу никчёмную жизнь получше и открыл мануал по ACML. Там оказалось 28 генераторов на все случаи Жизни. Для ваших простых судеб я взял самый простой базовый генератор с периодом повторения около 2^57, вам пока хватит. И вот что получилось.
Смотреть 46 секунд красоты:



Первоначально равномерно распределённые в квадрате 40 на 40 людишки начали активно жить, деловито передвигаясь то туда, то сюда, но как видно далеко не ушли. В этом вся суть человеческого Бытия, пацаны: хочешь жни, а хочешь куй — всё равно получишь xyi. Это и есть Правда.

Высокая Теория, которую я упоминал выше, учит, что при случайном блуждании на N шагов, дистанция смещения от начала движения будет пропорциональна корню из N. Первым это объяснил Эйнштейн в 1905 году, у нас тогда как раз была первая революция: «On the motion of small particles suspended in a stationary liquid demanded by the molecular-kinetic theory of heat» (Ann. Phys. Ser 4, 7 (1905), 549–560). Символично, не правда ли? Людишки в Петрограде хаотично слонялись от Зимнего к Пивной и обратно, но ушли недалеко. Почему? Эйнштейна не читали. Тот ясно объяснил, что пройденная дистанция, в случае хаотичного процесса, будет пропорциональна корню из времени. Ленин — иное дело. Мы достоверно не знаем, читал ли он работу Эйнштейна 1905 года, но двигался он целенаправленно, а не хаотично, как работяги с путиловского. Вот и результат. М-да… но мы отвлеклись.

Ладно, подумал я, глядя на хаотичное движение ваших жизней, ну а как далеко вы уйдёте от своих стартовых позиций? Имеет ли вообще смысл дёргаться в жизни или всё тлен?
Эйнштейн говорит, что смысл имеет, но мало. Но то Эйнштейн, его светлая голова — дело тёмное, а наше дело — экспериментальная Эволюция, подумал я, и добавил в симулятор модуль статистики:

if (dcount < dmaxcount)
{
    dist[dcount] += sqrt(pos[i].x * pos[i].x + pos[i].y * pos[i].y);
}


Прогнав ваши Жизни через Симулятор ещё раз и скинув результаты на диск, я приступил к анализу результатов.

Обсуждение результатов


На рисунке 2 изображена Истина ваших Жизней:
Рэндом генерация при тестировании жизненных стратегий, короче трёп за жизнь (научная статья)
Рисунок 2. Зависимость пройденной дистанции от количества шагов.

Синяя линия — это чёртова теория, чёрная — это тысячи точек ваших жизней слились в одну кривулину, ну а красная, это rand()-артефакт.
Сначала давайте поржём над квази-рандомной функцией rand() из math.h — её результаты изображены красным цветом. На самом деле, пацаны, это очень важный и серьёзный результат. Когда вы будете тестировать ваши жизненные или биржевые стратегии, вам нужно очень внимательно относиться к генераторам случайных чисел. Дело в том, что большинство программ и пакетов для анализа пишется на языках C/C++, и потому, с высочайшей вероятностью, наследуют херовый рандом из math.h
Поэтому, если в ваших тестах с участием рандом-генератора попёрла P/L и эквити улетело в космос, то глядите в оба: хороший рандом в космос летит медленно, как завещал лохматый Эйнштейн.

Чёрные точки наших жизней идеально ложатся на синюю теор.кривую с коэффициентом 0.888. Красиво, правда? На графике синяя линяя без коэффициента, чтобы разнести её с чёрной, но если умножить, то она идеально ложится на чёрные точки. На сколько идеально? Не знаю, пацаны, мне чё то лень проверять. Качественно и количественно с точностью около одной тысячной симуляция подтверждает теорию. Ну а если вам нужно точное значение невязки — пишите свой симулятор и считайте. Бох в помощь, как гритса.

Для нас наибольшую ценность представляет начало этого графика в диапазоне N:0-50 шагов, столько сколько можно пройти за человеческую жизнь. Я специально увеличил его, чтобы было удобнее рассматривать цифры.
Рэндом генерация при тестировании жизненных стратегий, короче трёп за жизнь (научная статья)
Рисунок 3. То же, что рис.2, увеличенный график.


Какой вывод может сделать простой пацан, глядя на этот график? А такой, что за 40 лет блужданий, космическая пылинка — человек, сдвинется примерно на 5-6 шагов от исходной точки! И если ты будешь двигать осмысленно в одну сторону, то за 7 лет линейного движения уйдёшь дальше, чем хаотичный человек в среднем за ВСЮ жизнь! Двигаясь однонаправленно более 10 лет, ты оставишь далеко позади подавляющее большинство популяции людей. Теоретически, этот вывод не имеет специализации, ты можешь заняться чем угодно и через 6 лет будешь так же далеко, как и средний по популяции человек. Ты будешь не хуже.

Выводы


Общий вывод такой: симуляция утверждает, что за N шагов вашей бессмысленной жизни вы сместитесь от первоначальной позиции на 0.88*корень_из(N).
Двигай в ОДНУ И ТУ ЖЕ сторону ЦЕЛЕНАПРАВЛЕННО больше 6 лет и обойдёшь большинство своих сородичей!

На этом всё, пацаны. Экскурс в теорию случайного движения и практическую симуляцию Жизни завершён.
Теперь вы вооружены Знанием.
А Знание — Сила!

Да пребудет с вами Сила!
Аминь.

★7
17 комментариев
Отлично! (и да, 80% чтения я думал: что за херня?)
avatar
это как в лесу когда нет ориентира человек ходит кругами
Как то по молодости работал в Швеции. Все время удивлялся — как так: они «ни хера не делают» а всего добиваются. Мы пашем как черти и никак...
Пришел примерно к тому же выводу, что они все (каждый) потихоньку, по чуть -чуть двигают свой мир но в одном  направлении. Все! начиная от государства и заканчивая простой уборщицей. Мы же все в поту — но все в разных направлениях.
Сразу вспомнил Крылова...

За исследования спасибо отдельное.
Удачи! 
avatar
Sergiovy, зато у нас все эрудированные и все все знают и умеют(особенно воспитанные при совке)поговорить всегда есть с кем на разные темы только вот результат их деятельности не всегда совпадает с ожиданиями

Поздравляю с освоением методов графической визуализации в C

Как я понял, топик об этом :)

avatar
PSH, нет. главное симуляция. а визуализация для красоты. я эстет, бля.
avatar

Kapeks, с «симуляцией» тут моя бабушка справится
К слову о «симуляции» в c и функции rand(), стоит ознакомиться с матчастью https://www.geeksforgeeks.org/rand-and-srand-in-ccpp/

avatar
PSH, просто ты унылый ботан.
avatar
Kapeks, ты не эстет, обычный мудак.
avatar
Gold Schmuck GMBH, ты откуда вылез, придурок?
avatar
Спасибо за интересный пост.
1. Постановка задачи не Полна: Не указано где Цель?
Если, например, статичная Цель в начальной точке, у Вас под ногами, то Выигрывают, те кто блуждает близко к начальной точке.
Так что бежать от начала «куда глаза глядят» со скоростью распространения электромагнитного излучения в вакууме без Цели и чувствовать себя Чемпионом не всегда полезно.
Ведь, как в песне поется «Там За горизонтом Там, ТамТарам, ТамТарам»
А нам такой хоккей ТамТарам не нужен.

Как в «Алхимике» Чувак «сто верст» исколесил, вернулся домой еле живой, а «сокровище» было на чердаке его дома (в начальной точке ).

Цель надо поставить.

Также не рассмотрен случай  блуждающей по разным законам Цели.

2. Почему в коде симулятора нет case-ов  «отсутствие смещения» по X или Y ? 

Вообщем одни вопросы.
avatar
_sg_, 
1. Цель всегда одна и та же. Оттрахать максимальное кол-во баб.
2. Да, это так. Такая модель. На каждом шаге куда-то смещаемся. На месте остаётся только покойник. Живой чек всё равно куда то смещается, хотя бы просто по течению Жизни.
avatar
Автор, исходниками не взападло поделиться? Визуализацию в С я так и не осилил. В питоне научился все делать что надо, но было бы прикольно исключить этот ненужный шаг когда надо перекидывать данные сгенерированные в С++ в какой-нибудь текстовичок для визуализации его через питон…
avatar
tranquility, не осилил, значит не судьба. исходники тут не помогут. но советом помогу. графические библиотеки юзай. удачи.
avatar
Kapeks, не знаю, мне помогают обычно. С гнуплот и опенгл не вышло, т.к. в момент когда они были нужны и не мешало бы разобраться, подвернулся питон, а там порог входа для всего этого меньше. Если интересно, тогда давай бартер. Ты мне как в С нарисовать график, а я тебе — на питоне. Ты мне в С опенгл сцену, а я тебе на питоне.
avatar

теги блога Kapeks

....все тэги



UPDONW
Новый дизайн