Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Интересная статья почитать для общего развития.
Похоже, что я чего-то не понял. Попробовал изобразить простую игру с конвертами (ничего, что на lua?). И получаются всегда одинаковые суммы выигрыша.
Где я накосячил?
math.randomseed(os.time())
s1 = 0 --никогда не менять конверт
s2 = 0 --всегда менять конверт
for i = 1, 100000
do
--генерация суммы в конверте
--local sum_in_konv = math.random(1, 100)
local sum_in_konv = 5 --Пусть даже сумма постоянная
local k = math.random(1, 2)
if
k == 1
then
k1 = sum_in_konv
k2 = 2 * sum_in_konv
else
k1 = 2 * sum_in_konv
k2 = sum_in_konv
end
--выбор конверта
local k = math.random(1, 2)
if
k == 1
then --выбран 1-й конверт
s1 = s1 + k1
s2 = s2 + k2
else --выбран 2-й конверт
s1 = s1 + k2
s2 = s2 + k1
end
end
print(s1)
print(s2)
N>Похоже, что я чего-то не понял. Попробовал изобразить простую игру с конвертами (ничего, что на lua?). И получаются всегда одинаковые суммы выигрыша.
Ну у меня не получаются во-первых. Наверное плохо генерируете случ. числа.
А во вторых статья немного не про это.
Здравствуйте, Шебеко Евгений, Вы писали:
N>>Похоже, что я чего-то не понял. Попробовал изобразить простую игру с конвертами (ничего, что на lua?). И получаются всегда одинаковые суммы выигрыша. ШЕ>Ну у меня не получаются во-первых. Наверное плохо генерируете случ. числа.
У тебя тоже, значит, не получилось. Начальная посылка статьи — при смене конверта должен увеличиться выигрыш:
Т.е. в нашем случае C = 7.5, а s2 = 100000 * (5 / 4 * C) = 937500
Но этого не происходит ни у меня, ни у тебя.
ШЕ>А во вторых статья немного не про это.
Так я пытаюсь увидеть хотя бы проблему, о которой говорится в статье. Где она?
N>Так я пытаюсь увидеть хотя бы проблему, о которой говорится в статье. Где она?
Если я правильно понял, то идея такая.
Но у меня самого не получается это воспроизвести. Наверное нужен генератор действительно случайных чисел,
а не псевдослучайных.
#include <iostream>
#include <string>
#include <time.h>
int main(int argc, char **argv)
{
srand(time(0));
unsigned long long s1=0;
unsigned long long s2=0;
for(unsigned i=0;i<1000000;i++)
{
unsigned sum_in_konv=rand();
bool k=rand()>(RAND_MAX/2);
unsigned k1,k2;
if(k)
{
k1=sum_in_konv;
k2=2*sum_in_konv;
}
else
{
k1=2*sum_in_konv;
k2=sum_in_konv;
}
k=rand()>(RAND_MAX/2);
if(k)s1+=k1;
else s1+=k2;
s2+=k2;
}
std::cout<<"s1="<<s1<<std::endl;
std::cout<<"s2="<<s2<<std::endl;
}
Здравствуйте, Шебеко Евгений, Вы писали:
>Но у меня самого не получается это воспроизвести. Наверное нужен генератор действительно случайных чисел, >а не псевдослучайных.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Но у меня самого не получается это воспроизвести. Наверное нужен генератор действительно случайных чисел, ШЕ>а не псевдослучайных.
Тут дело не в генераторе Просто ты строишь эксперимент по условию задачи. Генерируешь два числа и с ними работаешь.
А чтобы что-то изменилось, надо его строить по ходу рассуждений. Генерировать сначала одно число (которое мы выбрали), потом второе.
Другими словами, ты только что доказал что источник парадокса — банальная ошибка в рассуждениях. Вера что при смене конвертов будет выигрыш — мракобесие (что кстати неудивительно, учитывая что направлено это всё на биржевых игроков).
В статье ход рассуждений неверный. "Если у нас в конверте 10$", и полетели обобщения. Между тем, вот это "если", оно просто обязано быть оформлено математически, поскольку имеет вероятностную основу.
Поясняю на пальцах. Вероятность выпадения любой пары чисел у нас одинакова, примем её за n.
Тогда фраза "если у нас в конверте 10$" означает следующее: с вероятностью n/2 у нас десятка из пары 10-5, и с вероятностью n/2 у нас десятка из пары 10-20.
Прекрасно, меняя конверт получаем взвешенную сумму: n/2 * 5 + n/2 * 20. Не меняя: n/2*10 + n/2*10. Всё по статье. Но обобщать это на все случаи категорически нельзя, потому как это условные вероятности, влияющие на соседние пары.
Для пояснения рассмотрим все пары конвертов, имеющие в составе десятку ( а не только те где десятка выбрана первой).
Вероятность конверт пара вс меняя вс не меняя
n/2 10 10-5 5*n/2 10*n/2
n/2 10 10-20 20*n/2 10*n/2
n/2 5 10-5 10*n/2 5*n/2
n/2 20 10-20 10*n/2 20*n/2
Статья для играющих на бирже лохов, имхо. Не верю что нормальный спец в тервере может такого не понимать.
Парадокс происходит из-за необоснованного обобщения. Достаточно стандартная логическая ошибка, которую в этом случае непросто заметить.
Из предположения ("предположим мы вытянули конверт с 10$") делается обобщение на всё решение.
Это всё равно что в задаче "какова вероятность что оба ребёнка в семье — мальчики" рассуждать следующим образом: предположим что один из детей — мальчик. Тогда вероятность того что второй тоже мальчик — 1/2. Следовательно вероятность того что оба мальчики — 1/2.
И что? Какой вывод следует из это системы?
Я не спорю, просто не понимаю.
Можно ещё и вывод из этой системы на пальцах
Желательно тоже в числах.
S>Статья для играющих на бирже лохов, имхо.
Статья общеобразовательная, к бирже вообще отношения не имеет.
Наоборот:
Понятно, что если игрок располагает информацией о приобретаемых финансовых инструментах (состояние компании, судебные дела против её менеджеров, урожай апельсинов в этом году или открытие нового месторождения нефти), он может составлять свой портфель осознанно. Но если ему не известно ничего, кроме текущей цены акции (или иного приобретения), и того, куда цена сейчас движется? Ни того, будет ли цена ещё падать, или позже начнётся рост? Ни того — является ли нынешняя цена максимальной, минимальной или позже будет огромный провал.
Но можно ли, допустим, применить следствие из парадокса Паррондо (или объяснения феномена конвертов) к фондовому рынку, то есть получить доход, комбинируя акции вроде игры АВВАВВ? Увы, парадокс требует, чтобы доходность по меньшей мере от одного инструмента зависела от величины текущего суммарного капитала (как выбор монеты от кратности уже выигранной суммы числу М), а это фикция. Или нет?
Мне вот интересно как они этого добились?
Ныне свыше 20 миллионов компьютерных симуляций, проведённых Макдоннелом и Эбботтом, показали, что стратегия Ковера позволяет получить больше денег в игре с конвертами, чем простой обмен. А ещё, открыли австралийские учёные, предопределённый обмен, когда игрок выбирает альтернативный конверт только в том случае, если увиденная в первом сумма меньше заранее и наугад выбранного им самим (игроком) значения, тоже работает.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>И что? Какой вывод следует из это системы? ШЕ>Я не спорю, просто не понимаю. ШЕ>Можно ещё и вывод из этой системы на пальцах ШЕ>Желательно тоже в числах.
В смысле, если будешь менять конверты — взвешенная сумма получается 45*n/2. Если не будешь — тоже 45*n/2. Можешь расширять на любое количество пар чисел, результат будет тот же. Ценность подхода в том что он наглядно показывает, откуда берётся ошибочное решение.
S>Тут дело не в генераторе Просто ты строишь эксперимент по условию задачи. Генерируешь два числа и с ними работаешь.
Меня смущает то, что нет какой-то чёткой зависимости между s1 и s2.
Как-бы по логике их стратегия может быть правильной, ошибочной или равнозначной.
И с большим к-вом итераций это должно быть видно.
Может получиться что s1>>s2 буквально во 2-3 старшем разряде, или
s1<<s2 точно так же, или s1~=s2.
Согласитесь, с большим к-вом итераций это не нормально. Поэтому и грешу на генератор.
Здравствуйте, Sealcon190, Вы писали:
S>В смысле, если будешь менять конверты — взвешенная сумма получается 45*n/2. Если не будешь — тоже 45*n/2. Можешь расширять на любое количество пар чисел, результат будет тот же. Ценность подхода в том что он наглядно показывает, откуда берётся ошибочное решение.
Да, исходная проблема у них явно надуманна. Однако, если делать выбор о смене конверта на основании какой-либо предопределённой суммы, стабильный выигрыш появляется. Но мне данный факт представляется очевидным и никак не сенсационным.
math.randomseed(os.time())
s1 = 0 --никогда не менять конверт
s2 = 0 --всегда менять конверт
change_cout = 0 --число смен конвертов
for i = 1, 100000
do
--генерация суммы в конверте от 1 до 200 денежных единиц
local sum_in_konv = math.random(1, 100)
--local sum_in_konv = 5
local k = math.random(1, 2)
if
k == 1
then
k1 = sum_in_konv
k2 = 2 * sum_in_konv
else
k1 = 2 * sum_in_konv
k2 = sum_in_konv
end
--выбор конверта
local sum_change = 10 --Если сума в открытом конверте меньше данной, то меняем конверт
local k = math.random(1, 2)
if
k == 1
then --выбран 1-й конверт
s1 = s1 + k1
if (k1 < sum_change)
then
s2 = s2 + k2
change_cout = change_cout + 1
else
s2 = s2 + k1
end
else --выбран 2-й конверт
s1 = s1 + k2
if (k2 < sum_change)
then
s2 = s2 + k1
change_cout = change_cout + 1
else
s2 = s2 + k2
end
end
end
print(s1)
print(s2)
print(s2 - s1)
print(change_cout)
Результат:
7609414 — выигрыш в результате обычной стратегии
7627214 — выигрыш в результате новой стратегии
17800 — разница
6461 — число смен конвертов
Т.е. в случае выпадения суммы, которой игрок может пренебречь, он рискует и в перспективе выигрывает. Вполне логично, но не сенсационно.
К сказанному выше добавлю:
1) нарушение симметрии, о котором с таким восторгом писали авторы, имеет место лишь при оценке суммы выигрыша. На самом деле, вскрытие первого конверта и всего лишь влияет на сумму оценки в каждом опыте, а не на реально полученный выигрыш, ведь его можно получить и не вскрывая конверт
Ничего удивительного нет, вспомни, например, коэфициент 1/sqrt(n-1) при оценке дисперсии, а не 1/sqrt(n-1) — тут должна быть проведена такая же коррекция.
2) предложенные программы имеют существенный недостаток: ограничение сверху максимального числа, следовательно нарушается гипотеза о равномерном распределении чисел. И очевидно этим пользуются при проведении "опытов" авторы статьи. Ведь если число больше MAX/2, это значит, что оно будет большим в паре. Если же брать не MAX/2, а произвольное "задуманное авторами число", что это всего лишь немного изменит параметры распределения, но не его характер.
Так что да, статья написана в расчёте на биржевых лопухов
Курица — это инструмент, с помощью которого одно яйцо производит другие.
N>7609414 — выигрыш в результате обычной стратегии
N>7627214 — выигрыш в результате новой стратегии
N>17800 — разница
N>6461 — число смен конвертов
N>Т.е. в случае выпадения суммы, которой игрок может пренебречь, он рискует и в перспективе выигрывает. Вполне логично, но не сенсационно.
Ваш опыт верен в предположении равномерного распределения базовой суммы в интервале (1, 100). Если взять границу решения > 190, то выигрыш при смене конверта будет меньше, не так ли? Так что оценкой тут будет не возможность пренебречь некоторой суммой, а априорное знание о распределении суммы.
Здравствуйте, Gadsky, Вы писали:
G>Ваш опыт верен в предположении равномерного распределения базовой суммы в интервале (1, 100). Если взять границу решения > 190, то выигрыш при смене конверта будет меньше, не так ли? Так что оценкой тут будет не возможность пренебречь некоторой суммой, а априорное знание о распределении суммы.
Мы же всё таки не в неизвестной вселенной играем в кости с местным богом. Даже на бирже можно примерно знать ограничение максимального разброса котировок.
Здравствуйте, Sealcon190, Вы писали:
S>Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>>Но у меня самого не получается это воспроизвести. Наверное нужен генератор действительно случайных чисел, ШЕ>>а не псевдослучайных.
S>Тут дело не в генераторе Просто ты строишь эксперимент по условию задачи. Генерируешь два числа и с ними работаешь.
S>А чтобы что-то изменилось, надо его строить по ходу рассуждений. Генерировать сначала одно число (которое мы выбрали), потом второе.
S>Другими словами, ты только что доказал что источник парадокса — банальная ошибка в рассуждениях. Вера что при смене конвертов будет выигрыш — мракобесие (что кстати неудивительно, учитывая что направлено это всё на биржевых игроков).
Если генерировать сначала одно число (выбирать первый конверт), потом с вероятностями .5 это число делить/умножать на 2, то честно вылезает 5/4 для второго конверта:
proc getAmount {} {
return [expr {rand() * 1000}]
}
#Returns 1 if we took envelope with smaller amount
proc isLower {} {
return [expr {rand() < 0.5}]
}
set s1 0
set s2 0
set repeatCount 100000
for {set i 0} {$i < $repeatCount} {incr i} {
set amount [getAmount]
set s1 [expr {$s1 + $amount}]
if {[isLower]} {
set amount [expr {$amount * 2}]
} else {
set amount [expr {$amount / 2}]
}
set s2 [expr {$s2 + $amount}]
}
puts "s1 = $s1"
puts "s2 = $s2"
puts "s1/s2 = [expr {$s1/$s2}]"
puts "(s1/s2) / (4/5) = [expr {$s1/$s2*5/4}]"