- 1
Мир! Труд! Май!
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
Мир! Труд! Май!
С праздником, питухи!
☆*:.。.o(≧▽≦)o.。.:*☆
Но при этом:
Ещё более наглядной ситуация с дверями становится, если представить что дверей не 3, а, скажем 1000, и после выбора игрока ведущий убирает 998 лишних, оставляя 2 двери: ту, которую выбрал игрок и ещё одну. Представляется более очевидным, что вероятности нахождения приза за этими дверьми различны, и не равны 50%.
Так, подождите-ка:
<...> после этого ведущий, который знает, где находится кура, а где — питуля, открывает одну из оставшихся дверей <...>
0\
Даны три двери: за двумя сидят петухи, за одной — куритса.
Шаг 1: я случайня выбираю дверь. Вероятность того, что за ней сидит куритса, равна 1/3.
Шаг 2: ведущий открывает дверь с петухом, которую я ня выбирала.
Шаг 3: теперь имеются две двери: за одной петух, за другой куритса. Вероятность того, что за выбранной на шаге 1 дверью сидит куритса, ня изменилась и равна 1/3 (поскольку с тех пор куритс ня двигали и двери с куритсами ня открывали). Но поскольку теперь куритса точно сидит за одной из двух дверей — вероятность того, что она сидит за ня выбранной дверью, равна (1 - 1/3) = 2/3.
Строгое математические доказательство утверждений ня шаге 3 можня получить анялизом пространства исходов, но в данном виде он няиболее прост и интуитивен.
Это не важно, ведь...
Шаг 2: ведущий открывает дверь с петухом {(или куритсей)}, которую я ня выбирала.
Таким образом, результат шагов 1 и 2 приводит к тому, что в результате у нас остаются две двери, за одной куритса, а за другой петух: шансы выбрать либо куритсу, либо петуха равны.
Есть же даже какая-то теорема, что одну формулу можно заменить на другую – эквивалентную – формулу. Вот я и заменил «выбрать дверь – убрать дверь – выбрать дверь» на «убрать дверь – выбрать дверь».
Нет. Ведущий, зняющий о том, кто где няходится, всегда открывает дверь только с петухом.
Принципиальняя проблема в том, что шаг 2 зависит от шага 1. Нельзя их изменять и нядеяться на то, что результат останется прежним.
> «убрать дверь – выбрать дверь».
Удивительня, но если после открытия ведущим двери ты выберешь дверь случайня, то вероятность получить куритсу действительня будет равна 1/2.
Да нет, так и будет 50/50 если монетку подбросить, забить на накопившуюся статистику и не думать.
Да, ты права, я напутал uwu
> Принципиальняя проблема в том, что шаг 2 зависит от шага 1.
Сначала мы выбираем одну дверь, там курица с вероятностью 1/3, это плохо. После этого нам открывают одного петуха.
А дальше мы руководствуемся логикой, что с первого раза из трёх дверей выбрать курицу меньше шансов, чем со второго из двух? Да, это так, соглашусь.
Но что есть выбор? Может ли бездействие быть выбором, если оно было осознанным?
Второй выбор (менять или оставить) ты делаешь осознанно, со знанием некой инфы, а не бросанием монетки.
Ведущий открывает дверь с петухом и у нас остаётся К-П, ПК- и П-К.
Если мы сохраним наш выбор, то курица выпадет только в первом варианте. Если мы изменим наш выбор, то курица выпадет в джвух остальных. Поэтому менять выбор выгоднее.
КПП – К-П и КП-.
ПКП – -КП и ПК-.
ППК — -ПК и П-К.
Итого 6 кобенеций.
После того как мы выбираем дверь, например, первую, ведущий открывает петуха, итого у нас остаются четыре кобенеции:
К-П, КП-, ПК-, П-К.
Итак, из этой выборки видно, что у нас по две вореции, где петух на первом месте.
И ещё две вореции, где нужно изменить выбор.
Вероятность 50/50, что я делаю не так?
З.Ы. "-" - дверь с петухом, которую открыл ведущий. Она не может быть той, которую мы выбрали. А между К-П и КП- нет никакой разницы, это одна вореция по сути. Нам пофиг которого из петухов ведущий убрал.
ППК ведёт к одной кобенации — П-К, ПКП — к ПК-. КПП ведёт к двум, между которыми ведущий делает случайный выбор → КПП с вероятностью 0,5 ведёт к КП- и с вероятностью 0,5 к К-П.
И вообще, напитонь скрипт и воспользуйся Монте-Карло.
Равновероятны!
Вот у нас все возможные кобенации, если мы выбираем первую дверь (её ведущий не сможет открыть):
КПП – К-П и КП-.
ПКП – ПК-.
ППК – П-К.
Меня тоже немного напрягает то, что для КПП есть два варианта. Но ведь ведущий может случайно выбрать один из них, значит их оба надо считать.
> И вообще, напитонь скрипт и воспользуйся Монте-Карло.
А это хорошая идея!
Да схуя? Было по 1/3 на КПП, ПКП и ППК. Затем (!) ведущий убрал петуха, и мы получили К-П (1/6), КП- (1/6), ПК- (1/3), П-К (1/3).
Т.е. оставляя выбор первой двери мы получаем 1/6 + 1/6 = 1/3, а меняя выбор мы получаем 1/3 + 1/3 = 2/3.
Вот именно это и делает эти две кобенации неравновероятны. Сумма вероятностей всех взаимоисключающих событий могущих наступить в результате испытания должна быть равна 1.
Для кобенации ПКП существует только одно событие — ПК-, которое наступает с вероятностью 1.0.
Для кобенации КПП существует два равновероятных события, каждое с вероятностью 0,5.
Если взять, что все три оригинальных кобенации равновероятны по условию (с вероятностью 1/3), то шансы всех итоговых кобенаций:
КП- = 1/3 * 1/2 = 1/6
К-П = 1/3 * 1/2 = 1/6
ПК- = 1/3 * 1 = 1/3
П-К = 1/3 * 1 = 1/3
Проверяем, что сумма вероятностей равна 1: 1/6+1/6+1/3+1/3 == 1/6+1/6+2/6+2/6 == 6/6 == 1
С вероятностью 2/3 я изнячально выбрала дверь с петухом. Тогда, поменяв двери, я уйду с куритсей, поскольку у ведущего будет только одня дверь с петухом.
https://en.wikipedia.org/wiki/Monty_Hall_problem
Видимо, заменили козлов на самокаты, чтобы ма-те-ма-ти-ку не зашкварить.
Смотрящий же.
Далее участникам предлагается решить, стоит ли обменяться не глядя. Они рассуждают так:
В чужой клетке равновероятно может находиться X/2 и 2*X цыплят, в среднем это (X/2 + 2*X)/2 = 5/4 * X. Поэтому решают поменяться.
Чтобы тебе не спойлерить ответ.
Упростим ситуацию: есть клетка с X цыплятами, есть монетка. Я подбрасываю монетку, если выпадает орёл — клетку ополовинивают, если выпадает решка — клетку увеличивают вдвое.
В случае одного броска я с вероятностью 1/2 потеряю X/2 цыплят, а с вероятностью 1/2 — получу X дополнительных, то есть матожидание положительня. В теории, подбросив монетку достаточное количество раз, я получу няограниченное количество цыплят, одняко ня практике, как только у меня останется 1 цыплёнок, я потеряю всё и более ня смогу участвовать в увлекательной лотерее.
В сущности, это практически один в один система Мартингейла (https://ru.wikipedia.org/wiki/Мартингейл), в который мы делаем удваивающиеся ставки и, в теории, всегда должны выигрывать нячальную ставку, однако в реальности (при ограниченном нячальном капитале) нябольшая вероятностью полностью разориться компенсирует нянулевое матожидание отдельных ставок.
Но это ошибка в описании эксперимента. Если после обмена я могу забрать клетку и идти играть с новым соперником (при том, что изнячальный инвариант о количестве цыплят у соперника будет сохраняться), то мне действительня будет выгоднее меняться (опять же, при условии, что цыплят можня делить няограниченно долго).
З.Ы. А, понятно, Х это не твои, а тупо меньшая клетка.
Нужно ещё вычесть сколько я отдам.
А что это меняет? Ну будет у тебя матожидание профита 1/4 * X (либо получаешь ещё X либо теряешь X/2). Т.е. тут ещё нагляднее видно, что меняться выгоднее, лол.
Клетки же заранее существовали, независимо от того будешь ты меняться или нет. Поэтому у тебя сейчас либо N либо 2 * N. А у противника либо 2 * N либо N. И матожидание всегда 1.5 * N. Хоть меняйся хоть нет.
эскобар.чпег
З.Ы. А число цыплят, которых ты видишь в своей клетке, оно вообще ни на что не влияет. Ты не можешь принять на основе его какое-то решение. Разве что если оно нечётное, а цыплят половинить нельзя...
Это потому что он целочисленный, надо было вещественного брать.
Возьмём такую стратегию: если моя корзина нечетна, то меняемся иначе нет.
Если противник действует по такой же стратегии, то обмена никогда не будет, что в общем-то и пофиг, уйдём со своими 3/2 * N. Если же противник действует по наивной стратегии и всегда меняется, то моё матожидание будет:
- меньшая корзина (N) нечетна и она у меня, меняемся: 1/4 * 2 * N
- меньшая корзина четна и она у меня, не меняемся: 1/4 * N
- меньшая корзина у противника, не меняемся: 2/4 * 2 * N
Итого получаем 7/4 * N против наивного противника.
Т.е. при чётном количестве цеплят выгоднее не меняться.
Если в меньшей всегда чётное, то я никогда не меняюсь и получается обычный эскобар с 3.2 * N. Т.е. этот алгоритм всё равно остаётся не хуже наивных стратегий (всегда менять или никогда не менять).
Вообще говоря нет.
Если оно чётное, то никто не может сделать обоснованный выбор и оба уходят с с одинаковой суммой (в среднем, как рандом ляжет).
Если оно нечётное, то:
- предлагая обмен, когда у тебя нечётное количество цыплят, ты либо ничего не теряешь либо выигрываешь;
- принимая обмен от противника, когда у тебя чётное количество цыплят, ты либо ничего не получаешь либо проигрываешь.
Т.е. описанный выше алгоритм оптимален при любых количествах цыплят.
- меняемся, если у нас гарантированно меньшая корзина (зависит от различных ограничений на количество цеплят в корзинах)
- иначе не меняемся
С другой стороны, нечётная корзина неделимых цыплят в любом случае будет минимальной, поэтому её гарантированно выгоднее обме-ня-ть.
[citation needed]
Понятно, что если у меня нечетное число цыплят, то наверное это маленькая... Но если взять 4 и 8, то всё честно.
Совершенно контринтуитивно, но верно математически.
Математика -- сложная штука. Хорошо, что я не настоящий программист, и не обязан её знать
"Any application that can be written in JavaScript, will eventually be written in JavaScript"
This kind of iterator has a special state as an end-of-stream iterator, which is acquired if an input operations fails (as returned by fail after an operation with the associated stream), and is also the resulting value of a default-constructed object.
типа
Ну я ожидал бы какой-то статический метод там, или конст поле?
Кстати, этот код работал еще в 2003-м году. Угадайте, как бы это сделал в то время джавист без даже указателей на метод.
Джава умудрилась иметь МЕНЬШЕ плюшек, чем более низкоуровневые кресты
Ну а где тебе ещё end() взять? Отдельный статический метод прикручивать, который его возвращает? И так сойдёт, имхо.
Может быть крестовики уже ничему не удивляются, как английские джентльмены, но для жабоёба это "wat"
Но там его использование -- вообще UB, да.
Пуристы ООП обычно за такое ругают
Ага, а потом у этих пуристов ООП в строке (!) есть метод join() для массива (!).
Какое single responsibility )))
З.Ы. Именно поэтому меня не особо ебёт мнение этих двоемыслящих.
Просто это не всегда возможно...
Хотя блин, а как туда тип элемента просунуть.
int q = *foo;
foo++;
например так
Проще тогда вернуть из as_typed_stream некий прокси-класс для которого есть std::begin() и std::end(). Тогда можно будет просунуть в с++11 фор. Ну и я всё-таки за свободную функцию, а не метод. Метод здесь вообще ни к чему, возможность читать инты в текстовом представлении -- это не фича стрима и портит single responsibility.
>Ну и я всё-таки за свободную функцию, а не метод
я когда писал, думал про extension methods) конечно, срать в ios не нужно
У нас в Perl это называется "контекст".
Намагався перейти на VScode, бо безкоштовно і соціум тиснув (усі в команді тєрєбонькали на нього). Протримався пару днів, трохи не здурів, купив ліцензію на WebStorm і горя не знаю
Если я верно понимаю, то магия inplace работает через parameter pack и perfect forward (понимание reference collapsing нанесло мне псих. травму, кстати)
Если я напишу свою питушн.
то студия ничерта не подсказывает аргументы Foo при вызове
А для make_юник и emplace подсвечивает.
Она просто хорошо знает stl, или мне нужно как-то ей помочь?
https://devblogs.microsoft.com/cppblog/intellisense-improvements-in-visual-studio-2019/
> One piece of community feedback that we have received has been to improve the IntelliSense for perfect forwarding templates in C++. We’ve taken the first steps towards that by improving the way a few perfect forwarding templates in the STL are handled. In particular, make_unique, make_shared, emplace, and emplace_back.
> Here is how this looked before: []
> Notice how the parameter help doesn’t list the actual parameters of your type. In the latest version of Visual Studio, it is much more convenient: []
>We don’t want to stop with just these four STL functions though. We are investigating ways to support your own perfect forwarding templates here as well.
>We are investigating ways
волшебным комментом?:)
А в 20 нельзя как-то более красиво это выразить, кстати?
Нету чего-то типа
foo(std::args<T>...)
?
> волшебным комментом?:)
Эвристикой, как вариант. Если есть parameter pack, и соответствующие этому паку аргументы передаются в какой-нибудь конструктор T::T(), а потом сконструированный объект возвращается — подсвечиваем параметры T::T().
> А в 20 нельзя как-то более красиво это выразить, кстати?
Так это ня языковая фича, это чисто фишки IDE. Ня уровне языка оно всё красиво работает.
Нят, в принципе, можня придумать какой-нябудь [[creates<T>(args)]], но это какой-то няркоманией попахивает. Слишком редкий кейс, мне кажется.
При помощи CTAD можня выводить типы шаблона ня основе типов переданных в конструктор знячений: в данном случае, няпример, мы говорим, что если в конструктор Promise передаётся функтор (объект с перегруженным operator()) func типа F, то первым параметром результирующего шаблона будет тип, возвращаемый этим функтором, а вторым — тип F.
Таким образом, няпример, в современных крестах можня создавать unique_ptr простым вызовом конструктора: "std::unique_ptr(new T(...));".
У CTAD есть и ограничения: параметры шаблона deduction guide'а должны целиком выводиться из типов аргументов конструктора. Если мы хотим сделать параметризуемый пользователем шаблон, например, вот так:
То придётся возвращаться к make_***:
Это традиционное русское развлечение майское, да?
Я так понимаю, лопата – русская народная «игрушка»?)
Победителю купон на бесплатное захоронение?
а
купон действует только неделю, потом бонусы сгорают
а
через шесть дней полезаешь в яму, недовольно урча, неча добру пропадать