Не второе, первое, второе
Nov. 22nd, 2017 06:47 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)

Афанасий и Бонифаций режутся в азартную игру на щелбаны с такими правилами:
- Афанасий выбирает произвольную последователность из трёх выпадений монеты, например орёл-решка-решка, и сообщает её Бонифацию.
- Бонифаций выбирает любую другую последовательность из трёх выпадений, например решка-решка-орёл, и сообщает её Афанасию.
- Игроки кидают монету и записывают результаты до тех пор, пока не встретится одна из этих последовательностей. Чья последовательность реализовалась первой, тот и выиграл.
Честная ли это игра, то есть одинаковы ли шансы у Афанасия и Бонифация?
Это нечестная игра Пенни, в ней преимущество на стороне Бонифация. Если Афанасий выбирает свою последовательность случайно, шансы Бонифация выиграть 7:2. Оптимальная стратегия Афанасия — выбирать последовательность с разными значениями первого и второго выпадения, при этом шансы Бонифация снижаются до 2:1. Вот раскладка для всех возможных выборов Афанасия:
Афанасий | Бонифаций | Шансы Бонифация |
TTT | HTT | 7:1 |
HTT | HHT | 2:1 |
THT | TTH | 2:1 |
HHT | THH | 3:1 |
TTH | HTT | 3:1 |
HTH | HHT | 2:1 |
THH | TTH | 2:1 |
HHH | THH | 7:1 |
Пропустившие лекции по теорверу могут проверить теоретические цифры монте-карлом:
// Monte-Carlo simulation of Penney's game #include <iostream> #include <random> int main(void) { unsigned games = 10000000; std::default_random_engine gen(42); std::uniform_int_distribution<unsigned long long> dist; std::cout << "a_seq\tb_seq\tb:a\n"; for (unsigned a_seq = 0; a_seq < 8; a_seq++) { // Possible choices of player A unsigned b_seq = ((~a_seq & 2) >> 1) // not-second | (( a_seq & 1) << 1) // first | (( a_seq & 2) << 1); // second unsigned a_won = 0; // Number of times player A won unsigned b_won = 0; // Number of times player B won for (unsigned game = 0; game < games; game++) { unsigned long long x = dist(gen); for (unsigned flip = 0; flip < sizeof(x) * 8; flip++) { if ((x & 7) == a_seq) { a_won++; break; } if ((x & 7) == b_seq) { b_won++; break; } x >>= 1; } } std::cout << ((a_seq & 1) ? 'H' : 'T') << ((a_seq & 2) ? 'H' : 'T') << ((a_seq & 4) ? 'H' : 'T') << "\t" << ((b_seq & 1) ? 'H' : 'T') << ((b_seq & 2) ? 'H' : 'T') << ((b_seq & 4) ? 'H' : 'T') << "\t" << (double)b_won / a_won << "\n"; } return 0; }
Мнемоника для Бонифация вынесена в заголовок. Если Афанасий выбрал последовательность (Первое, Второе, Третье), то Бонифацию нужно выбрать последовательность (Не-второе, Первое, Второе). В приведённом примере, где Афанасий выбрал (Первое=орёл, Второе=решка, Третье=решка), Бонифацию нужно выбирать (Не-второе=орёл, Первое=орёл, Второе=решка).