Процедура для produce an unbiased coin from a biased one была сначала отнесена к Von Neumann (парень, который сделал огромную работу в математике и многих связанных областях). Процедура очень проста:
- Бросьте монету дважды.
- Если результаты совпадают, начните с забвения обоих результатов.
- Если результаты отличаются, используйте первый результат, забыв о втором.
Причина этот алгоритм работает потому, что вероятность получения HT является p(1-p)
, который так же, как получение TH (1-p)p
. Таким образом, два события одинаково вероятны.
Я также читаю эту книгу и спрашивает ожидаемое время работы. Вероятность того, что два отказа не равны, равна z = 2*p*(1-p)
, поэтому ожидаемое время работы 1/z
.
предыдущий пример выглядит поощрение (в конце концов, если у вас есть предвзятое монету с уклоном p=0.99
, вам нужно будет бросать монетку примерно в 50 раз, что не так много). Таким образом, вы можете подумать, что это оптимальный алгоритм. К сожалению, это не так.
Вот так оно сравнивается с Shannon's theoretical bound (взято из этого answer). Это показывает, что алгоритм хорош, но далеко не оптимален.
Вы можете прийти с улучшением, если вы будете считать, что HHTT будет отброшен по этому алгоритму, но на самом деле она имеет ту же вероятность, как TTHH. Таким образом, вы также можете остановиться здесь и вернуть H. То же самое с HHHHTTTT и так далее. Использование этих случаев улучшает ожидаемое время работы, но не делает его теоретически оптимальным.
И в конце концов - код Python:
import random
def biased(p):
# create a biased coin
return 1 if random.random() < p else 0
def unbiased_from_biased(p):
n1, n2 = biased(p), biased(p)
while n1 == n2:
n1, n2 = biased(p), biased(p)
return n1
p = random.random()
print p
tosses = [unbiased_from_biased(p) for i in xrange(1000)]
n_1 = sum(tosses)
n_2 = len(tosses) - n_1
print n_1, n_2
Это довольно понятно, а вот пример результата:
0.0973181652114
505 495
Как вы видите, тем не менее, мы имели смещение 0.097
, мы получили приблизительно такое же число 1
и 0
Я бы предположил, что ответ связан с использованием предустановленного генератора после стандартного способа и один раз как обратная функция, так что у вас есть вероятность ap 0 раз и 1 (p-p) вероятность 0 второй итерации и микса эти два результата уравновешивают распределение. Однако я не знаю точной математики. –
Eric-yeah, если вы это сделали (rand() + (1-rand()))/2, вы могли бы разумно ожидать получить непредвзятый результат. Обратите внимание, что в приведенном выше случае вы должны дважды вызвать rand(), иначе вы всегда получите.5 – JohnE
@JohnE: По сути, это то, о чем я думал, но это не оставляет вас с прямой 0 или 1, которая запрашивается. Я думаю, что Пау ударил ноготь по голове своим ответом. –