Каждый раз, когда выпадает сначала орёл, а затем решка, записываем 1, когда сначала решка, а затем орёл - 0.
Да, верно.
Это самое простое, что можно сделать.
Незавсисмо от
двойки "01" и "10" выпадают с одинаковой вероятностью
каждая. Если для одной выдать "0", для другой "1", то в этой выходной последовательности они будут равновероятны. При этом двойки "11" и "00" просто выбрасываются - для них никакой выход не генерируется.
Важно: двойки должны быть (1,2), (3,4), (5,6), ..., а не (1,2), (2,3), (3,4),...
Интересно посмотреть какой КПД такого алгоритма - сколько в среднем новых битов он выдаёт на один входной бит.
Здесь, очевидно, это
.
В лучшем случае это
, если
. При других
оно будет меньше, плавно падая до нуля по параболе при
.
Закономерный вопрос, а можно ли сделать КПД получше?
Если вместо двоек брать более длинные подпоследовательности, то КПД в основном будет улучшатся (иногда не меняется, как при пререходе от 2 к 3).
Там тоже надо поотдельности рассмотреть случаи, когда в последовательности какое-то фиксированное количество единиц (например при длине 4 будут случаи - 1 единица/4 варианта, 2 единицы/6 вариантов, 3 единицы/4 варианта). Все эти варианты будут равновероятны внутри одного случая. Количество вариантов - это количество сочетаний
.
Значит для произвольной половины вариантов можно выдать "1", для другой половины "0" (если количество вариантов было нечётное, то какой-то один из них просто выбросить).
Наиболее оптимальными будут длины, когда все биномиальные коэффициенты чётные (кроме единиц на концах). Это например верно для длин равных степеням двойки
.
В таком случае КПД будет
.
Тут КПД будет приближатся к единице. И не только при
около
, но и для
очень маленьких или очень близких к 1.
Просто надо взять достаточно длинную подпоследовательность, чтобы вероятность что все нули или все единицы была близка к нулю.