Вопрос к знатокам теории вероятностей. - страница 2

 
Можно представить, что тик наверх решка, а вниз орёл, или наоборот! Но зачем это?!
 
david2:

Хорошо! Как рассчитать вероятность того, что при 22 бросках будет минимум 16 решек.
наверное, =(0,5)^5=0.5*0.25*0.25=0.03125
 
david2:

Да, но если по формуле рассчитать вероятность 16 из 22, мы сумеем также рассчитать 17 из 23 итд. и в итоге методом тыка и интерполяции найдем то количество сделок где вероятность равна 0.5. Например это может быть 80 из 150. 
Вероятность подобного события никогда не будет 0,5. Вероятность, например, 10 из 20 = 0,5, в других случаях-нет.
 
yosuf:
наверное, =(0,5)^0.5=0.5*0.25*0.25=0.03125

Интегральная теорема Муавра-Лапласа утверждает, что ответ другой :D
 
Reshetov:

Никак. Если монета правильная, то такое событие при любом количестве бросков произойдет с вероятностью менее 0.5




Неужели в процессе 10000 бросков количество выпадания решки ни разу не будет превосходить количество выпавших орлов всего на 10 единиц. Я думаю при таком количестве бросков вероятность данного события практически =1. Чтобы нужное нам событие произошло при 10 бросках, надо чтобы решка выпала 10 раз подряд.

Вероятность выпадания решки 10 раз подряд =0.5*0.5*0.5*0.5*0.5*0.5*0.5*0.5*0.5*0.5=0.001

Между 10 и 10000 должно быть то количество сделок где вероятность =0.5 

Есть ли программа, которая делает расчеты по формуле Бернулли?

Хотя все равно получится слишком трудоемкий процесс. Например если мы подозреваем что это количество сделок=150. То придется рассчитать не только вероятность выпадения решки минимум 80 раз при 150 бросках, но также 80 раз при 149, 79 раз при 148 итд.

Смысл всего этого в том , чтобы найти то количество сделок, где фактор случайности не влияет на оптимизацию. Сложно при слишком маленьком количестве сделок оптимизировать стратегию так, чтобы слить или удвоить депозит, даже если лот позволяет это сделать. Так же при слишком большом количестве сделок депо может быть как гарантированно удвоен так и гарантированно слит независимо от нашего определителя тренда. Трудно будет оптимизацией чего то добиться и если даже добьемся на истории это будет подгонка под исторический фактор случайности, а в будущем он будет другим. 

 

Конечно если при увеличении количества бросков вероятность стремится от 0.001 к 0.5 а не 1, то все мои мысли бесполезны. Но я в этом сильно сомневаюсь.  

 
david2:


Неужели в процессе 10000 бросков количество выпадания решки ни разу не будет превосходить количество выпавших орлов всего на 10 единиц.


Возможно будет и возможно, что неоднократно


david2:


Я думаю при таком количестве бросков вероятность данного события практически =1. Чтобы нужное нам событие произошло при 10 бросках, надо чтобы решка выпала 10 раз подряд.


Ваше думание о том, каким должно быть значение вероятности не совпадает с теорией вероятностей. Т.е. то что вы думаете - это ахинея.

Вероятность равная 1 - это сумма вероятностей всех несовместных событий, согласно теореме о полной вероятности, а не одного какого-то события. Вероятность равная 1 (достоверность) для одного единственного события может быть только в том случае, если никакие другие события невозможны (недостоверны). А поскольку вероятности событий, в которых разница выпадений бросков и решек не равна 10, возможны, то соответственно ваши думы - это ахинея.

Лучше учите математику, чем тут расписываться в собственной глупости и безграмотности.

 

Уважаемый топикстартер! Вашу ситуацию как раз описывает статья под названием (как ни странно) "Задача о разорении игрока".
Только надо долго курить выведенные там формулы условной вероятности.

Есть вариант №2 - решить эту задачу численным методом. Возьмём ту же самую игру с подбрасыванием монеты, пусть начальный капитал m=10, каждое выпадание орла увеличивает его на 1, выпадание решки - уменьшает на 1. Если m достигает 0, то фиксируем проигрыш.
Заводим массив p: array [0..100500] of Float, где 100500 - достаточно большое число, заполняем нулями, присваиваем p[m]:=1;  n, i - целые числа. Потом выполняем цикл вроде такого: (извиняюсь за г-код, давно ничего не писал)

n:=0;
repeat
  n:=n+1;
  for i:=1 to 100500-1 do begin
    p[i+1]:=p[i]/2; 
  end;
  for i:=100500-2 to 0 step -1 do begin
    p[i]:=p[i]+p[i+2];
  end;
until p[0]>=0.5;
write(n);

 В результате массив "размазывается" с каждым шагом и заполняется вероятностями достичь соответствующего баланса за n шагов, а в ячейке p[0] скапливается вероятность проигрыша, когда баланс достигает 0. По такому принципу можно определять "время половинной вероятности" для любого начального m.

Кстати, эта задача в непрерывном виде эквивалентна задаче о теплопроводности, когда в момент t=0 нагрет маленький участок с координатой x=m>0 бесконечного в положительную строрну стержня, а весь стержень имеет нулевую температуру, и в точке х=0 установлен теплоотвод. Найти время, за которое через теплоотвод выделится ровно половина первоначального тепла.

 
david2:


Неужели в процессе 10000 бросков количество выпадания решки ни разу не будет превосходить количество выпавших орлов всего на 10 единиц. Я думаю при таком количестве бросков вероятность данного события практически =1. Чтобы нужное нам событие произошло при 10 бросках, надо чтобы решка выпала 10 раз подряд.

Вероятность выпадания решки 10 раз подряд =0.5*0.5*0.5*0.5*0.5*0.5*0.5*0.5*0.5*0.5=0.001

Между 10 и 10000 должно быть то количество сделок где вероятность =0.5 

Есть ли программа, которая делает расчеты по формуле Бернулли?

Хотя все равно получится слишком трудоемкий процесс. Например если мы подозреваем что это количество сделок=150. То придется рассчитать не только вероятность выпадения решки минимум 80 раз при 150 бросках, но также 80 раз при 149, 79 раз при 148 итд.

Смысл всего этого в том , чтобы найти то количество сделок, где фактор случайности не влияет на оптимизацию. Сложно при слишком маленьком количестве сделок оптимизировать стратегию так, чтобы слить или удвоить депозит, даже если лот позволяет это сделать. Так же при слишком большом количестве сделок депо может быть как гарантированно удвоен так и гарантированно слит независимо от нашего определителя тренда. Трудно будет оптимизацией чего то добиться и если даже добьемся на истории это будет подгонка под исторический фактор случайности, а в будущем он будет другим. 

 

Конечно если при увеличении количества бросков вероятность стремится от 0.001 к 0.5 а не 1, то все мои мысли бесполезны. Но я в этом сильно сомневаюсь.  

Для малых значений количества бросков, скажем, не более 30, вероятность можно вычислить абсолютно точно, да ещё и строго по определению вероятности:

#property strict

/******************************************************************************/
struct BitArith {
private:
  /******************************************************************************/
  uint const mask;
  uint value;

public:
  /******************************************************************************/
  BitArith(uint const bits, uint const initvalue = 0):
  mask((1 << bits) - 1), // Если bits > 30, то поведение не определено
  value(initvalue & mask) {
  }

  /******************************************************************************/
  uint increment(uint const incr = 1) {
    return value = (value + incr) & mask;
  }

  /******************************************************************************/
  uint ones() const {
    uint ones = 0;

    for (uint tmp = value; tmp != 0; tmp >>= 1) {
      if ((tmp & 1) != 0) {
        ones++;
      }
    }

    return ones;
  }
};

/******************************************************************************/
void OnStart() {
  uint myCases = 0;
  uint allCases = 0;

  BitArith x(22);

  do {
    if (x.ones() >= 16) {
      myCases++;
    }

    allCases++;
  } while (x.increment() != 0);

  Print("myCases = ", myCases, ", allCases = ", allCases, ", Probability = ", (double)myCases / allCases);  
}

Для не менее 16 из 22-х результат равен:

23:50:25 Script 3 EURUSDm,H1: loaded successfully
23:50:25 3 EURUSDm,H1: initialized
23:50:25 3 EURUSDm,H1: myCases = 110056, allCases = 4194304, Probability = 0.02623939514160156
23:50:25 3 EURUSDm,H1: uninit reason 0
23:50:25 Script 3 EURUSDm,H1: removed

Довольно маленькая вероятность получается. Лично я думал, больше будет.

Данный инструмент можно использовать в качестве критерия верности формулы, которую вы найдёте. Теоретическая формула должна давать результат, совпадающий с тупо вычисленным грубой силой по определению вероятности.

Ну, и заодно поиграться, задавая значения, отличные от 16 и 22 (больше 30 "бросков" задавать не следует).

В частности, для начала можно также убедиться, что программа верно рассчитывает вероятность, проверив вручную все случаи для чисел размером 2-5 бит, когда число всех возможных исходов невелико.

 
simpleton:

  uint ones() const {
    uint ones = 0;

    for (uint tmp = value; tmp != 0; tmp >>= 1) {
      if ((tmp & 1) != 0) {
        ones++;
      }
    }

    return ones;
  }


Мб так?

uint ones() const {
  uint ones = value;
  ones = (ones & 0x55555555) + (ones >>  1) & 0x55555555;
  ones = (ones & 0x33333333) + (ones >>  2) & 0x33333333;
  ones = (ones & 0x0f0f0f0f) + (ones >>  4) & 0x0f0f0f0f;
  ones = (ones & 0x00ff00ff) + (ones >>  8) & 0x00ff00ff;
  ones = (ones & 0x0000ffff) + (ones >> 16) & 0x0000ffff;
  return ones;
}
 
anonymous:


Мб так?

Идиомы, ускоряющие вычисления и/или уравнивающие объём вычислений для разных значений операндов, вполне могут быть.

Однако, в данном случае, - ещё не факт, что при переборе всех значений, данная идиома окажется эффективнее.

Многовато действий. К тому же, в таком виде она не работает. Это - самый главный её недостаток:

#property strict

/******************************************************************************/
struct BitArith {
private:
  /******************************************************************************/
  uint const mask;
  uint value;

public:
  /******************************************************************************/
  BitArith(uint const bits, uint const initvalue = 0):
  mask((1 << bits) - 1), // Если bits > 30, то поведение не определено
  value(initvalue & mask) {
  }

  /******************************************************************************/
  uint increment(uint const incr = 1) {
    return value = (value + incr) & mask;
  }

  /******************************************************************************/
  uint ones() const {
    uint ones = 0;

    for (uint tmp = value; tmp != 0; tmp >>= 1) {
      if ((tmp & 1) != 0) {
        ones++;
      }
    }

    return ones;
  }

  /******************************************************************************/
  uint anotherones() const {
    uint ones = value;
    ones = (ones & 0x55555555) + (ones >>  1) & 0x55555555;
    ones = (ones & 0x33333333) + (ones >>  2) & 0x33333333;
    ones = (ones & 0x0f0f0f0f) + (ones >>  4) & 0x0f0f0f0f;
    ones = (ones & 0x00ff00ff) + (ones >>  8) & 0x00ff00ff;
    ones = (ones & 0x0000ffff) + (ones >> 16) & 0x0000ffff;
    return ones;
  }
};

/******************************************************************************/
void OnStart() {
  BitArith x(22, 10);
  BitArith y(22, 12);

  Print("x.ones() = ", x.ones(), ", y.ones() = ", y.ones());  
  Print("x.anotherones() = ", x.anotherones(), ", y.anotherones() = ", y.anotherones());  
}

Результат:

01:05:36 Script 3 EURUSDm,H1: loaded successfully
01:05:36 3 EURUSDm,H1: initialized
01:05:36 3 EURUSDm,H1: x.ones() = 2, y.ones() = 2
01:05:36 3 EURUSDm,H1: x.anotherones() = 2, y.anotherones() = 0
01:05:36 3 EURUSDm,H1: uninit reason 0
01:05:36 Script 3 EURUSDm,H1: removed

Нетрудно и в уме прикинуть, что в числе 12 два двоичных бита, как и в числе 10, а предложенная идиома даёт 0.

И вообще, 0 единичных битов встречаются  только в числе 0, все остальные числа имеют отличное от 0 число битов...