Бросая монетку...
Каково ожидаемое количество испытаний X
с двумя исходами, например, с классическими "орлом" и "решкой" при бросании монетки, нужное, чтобы получить N
"орлов" подряд?
Наверное, попытаемся не по Байесу, а "по-колхозному" :)
Пусть требуется X
испытаний для получения N
"орлов" подряд, предполагаем, что монета "идеализированная" и вероятности выпадения "орла" и "решки" равны 1/2.
Если в каком-то K
-ом испытании выпадает "решка", значит, мы потратили впустую все предыдущие испытания и нужно сделать ещё X
испытаний, чтобы получить нужную серию.
Вероятность этого события составляет 1 / 2K
, а общее количество попыток, необходимых для получения серии, равно (X + количество предыдущих пробных попыток)
.
Cуммирование всех таких вероятностей даст нам искомое количество испытаний для N
последовательных "орлов":
X = (1/2)*(X+1) + (1/4)*(X+2) + (1/8)*(X+3)+. . .+(1/2N)*(X+N) + (1/2N)*N
Решая это уравнение относительно X
, например, символьной командой Mathcad, получим
решение уравнения в Mathcad
или X = 2N+1 - 2
.
Ну-ка, как часто будет N = 5
"орлов" при X = 62
испытаниях на миллионе проверок?
Вот что вышло при проверке в консоли Studio 2019.
#include <iostream> #include <random> #include <cmath> using namespace std; int main() { int n = 5, x = pow(2, n + 1) - 2; random_device rd; default_random_engine generator(rd()); uniform_int_distribution <int> distribution(0, 1); int p, all = 1e6, //всего цепочек chains = 0, //найдено нужных цепочек из all what = 1, //какие значения считаем cnt; //сколько насчитали what подряд в цепочке for (int i = 0; i < all; i++) { cnt = 0; for (int k = 0; k < x; k++) { p = distribution(generator); if (p == what) { cnt++; if (cnt == n) chains++; } else cnt = 0; } } cout.precision(2); cout << endl << chains << " from " << all << " (" << ((double)chains/all)*100. << "%)" << endl; cin.get(); return 0; }
923181 from 1000000 (92%)
25.06.2020, 21:47 [1357 просмотров]