Это классическая вероятностная головоломка, и, насколько мне известно, вы не можете решить ее всего двумя вызовами функции. Однако вы можете сделать это с небольшим ожидаемым числом вызовов функции.
Наблюдение состоит в том, что если у вас есть смещенная монета, которая выпадает орлом с вероятностью p, и если вы подбрасываете монету дважды, то:
- Вероятность того, что решка выпадет дважды, равна p2.
- Вероятность того, что сначала выпадет орёл, а потом решка, равна p(1-p).
- Вероятность того, что сначала выпадет решка, а затем решка, равна (1-p)p.
- Вероятность того, что дважды выпадет решка, равна (1-p)2.
Теперь предположим, что вы несколько раз подбрасываете две монеты, пока они не получат разное значение. Если это произойдет, какова вероятность того, что первая монета выпадет орлом? Ну, если мы применим закон Байеса, мы получим, что
P(первая монета решка | обе монеты разные) = P(обе монеты разные | первая монета решка) P(первая монета решка) / P(обе монеты разные)
Вероятность того, что первая монета выпадет орлом, равна p, так как при любом подбрасывании монеты выпадет орел с вероятностью p. Вероятность того, что обе монеты различны при условии, что первая монета выпадет решкой, равна вероятности того, что вторая монета выпадет решкой, которая равна (1 - p). Наконец, вероятность того, что обе монеты различны, равна 2p(1-p), поскольку, если вы посмотрите на приведенную выше таблицу вероятностей, это может произойти двумя способами, каждый из которых имеет вероятность p(1-p). Упрощая, получаем, что
P(первая монета решка | обе монеты разные) = p (1-p) / (2p(1-p)) = 1/2.
Но какова вероятность того, что первая монета выпадет решкой, если монеты разные? Что ж, это то же самое, что и вероятность того, что первая монета не выпадет орлом, когда обе монеты разные, то есть 1 - 1/2 = 1/2.
Другими словами, если вы продолжаете подбрасывать две монеты до тех пор, пока они не получат разные значения, а затем берете значение первой подброшенной монеты, вы в конечном итоге получаете честную монету из необъективной монеты!
В C это может выглядеть так:
bool FairCoinFromBiasedCoin() {
bool coin1, coin2;
do {
coin1 = function_A();
coin2 = function_A();
} while (coin1 == coin2);
return coin1;
}
Это может показаться ужасно неэффективным, но на самом деле это не так уж и плохо. Вероятность того, что он завершится на каждой итерации, равна 2p(1 - p). При ожидании это означает, что нам нужно 1/(2p(1-p)) итераций, прежде чем этот цикл завершится. Для p = 40% это 1/(2 x 0,4 x 0,6) = 1/0,48 ~= 2,083 итерации. Каждая итерация подбрасывает две монеты, поэтому нам нужно, как ожидается, около 4,16 подбрасываний монеты, чтобы получить честный бросок.
Надеюсь это поможет!
person
templatetypedef
schedule
25.03.2011