2016-10-13 8 views
1

Использование Python 2.7. Предположим, у меня есть несправедливая монета, и я хочу превратить ее в честную монету, используя следующий способ:конвертировать несправедливую монету в честную монету в Python 2.7

  1. Вероятность создания головы равна для несправедливой монеты;
  2. Откинуть несправедливую монету и принять только голову;
  3. Когда появляется голова, рассматривайте ее как 1 (голова для виртуальной справедливой монеты), когда появляется другая голова, считайте ее 0 (хвост для виртуальной справедливой монеты), в следующий раз, когда появляется голова, относитесь к ней как 1, в следующий раз обработайте как 0, ... и так далее.

Не уверен, что этот метод работает? На самом деле я не совсем уверен в методе выше, а также как правильно использовать equalCoinHelper() (я отмечаю свой вопрос в своем коде).

Если у кого-нибудь есть хорошие идеи, это будет здорово.

from __future__ import print_function 
import random 
counter = 0 

# 0.3 probability return head as 1 
# 0.7 probability return tail as 0 
def unFairCoin(): 
    if random.random() < 0.3: 
     return 1 
    else: 
     return 0 

# probability of generating 1 is equal, so keep 1 only 
def equalCoinHelper(): 
    result = 0 
    while result == 0: 
     result = unFairCoin() 

def equalDistribution(): 
    global counter 
    # not think about how to leverage this better 
    equalCoinHelper() 
    counter += 1 
    if counter % 2 == 0: 
     return 1 
    else: 
     return 0 

if __name__ == "__main__": 
    # generate 10 random 0/1 with equal probability 
    print ([equalDistribution() for _ in range(10)]) 
+1

http://www.billthelizard.com/2009/09/getting-fair-toss-from-biased-coin.html – Barmar

+1

Google «превращает несправедливую монету в ярмарку», и вы найдете много документов, которые описывают одно и то же алгоритм. – Barmar

+0

billthelizard выглядит великолепно, он построен вами @Barmar? Потрясающие! –

ответ

2

Getting a Fair Toss From a Biased Coin объясняет простой алгоритм для превращения предвзятое монету в справедливой монеты:

  1. Флип монета в два раза.
  2. Если оба броска одинаковы (голова или хвосты-хвосты), повторите шаг 1.
  3. Если броски поднимаются на хвостики, подсчитайте бросок в виде головок. Если броски поднимаются на хвосты, считайте их хвостами.

В Python это будет:

def fairCoin(): 
    coin1 = unfairCoin() 
    coin2 = unfairCoin() 
    if coin1 == coin2: 
     return fairCoin() # both are the same, so repeat it 
    elif coin1 == 1 and coin2 == 0: 
     return 1 
    else: 
     return 0 

В elif и else блоки могут быть упрощены просто:

else: 
     return coin1 
+0

Спасибо, Barmar, я прочитал это и понимаю, что flip дважды или более раз (и сочетать результат 0/1) - это решение. Мой вопрос в том, можно ли решить проблему с помощью нового метода, как я уже говорил, перевернуть и сохранить только 1? Если нет, что не так с моим методом? –

+1

Я не знаю. Это больше похоже на математический вопрос, чем на программирование. – Barmar

+1

@LinMa math.stackexchange.com будет правильным местом, чтобы спросить о вашем методе – Barmar

2

Альтернативная реализация @ ответ Barmar, что позволяет избежать рекурсивного вызова (хотя это может быть безвредным)

def fairCoin(): 
    coin1 = 0 
    coin2 = 0 
    while coin1 == coin2: 
     coin1 = unfairCoin() 
     coin2 = unfairCoin() 
    return coin1 
+0

Спасибо user3386109, я понимаю ваш метод, мой вопрос в том, можно ли решить проблему с помощью нового метода, как я уже упоминал, перевернуть и сохранить только 1? Если нет, что не так с моим методом? –

+1

@LinMa Ваш метод не может работать, потому что если вы переворачиваете и сохраняете только 1, то вы вообще не использовали результат флип. – user3386109

+0

Спасибо user3386109, я думаю, что я использую флип-результат, так как я переворачиваю и получаю два числа 0 или 1, и я всегда держу 1. Я думаю, что для несправедливой монеты вероятность генерации 1 всегда одна и та же, правильная? –