1

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)])
4

2 に答える 2

3

偏ったコインから公正なトスを得るでは、偏ったコインを公正なコインに変えるための簡単なアルゴリズムについて説明します。

  1. コインを2回投げます。
  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
于 2016-10-13T05:51:08.610 に答える
2

再帰呼び出しを回避する@Barmarの回答の代替実装(無害かもしれませんが)

def fairCoin():
    coin1 = 0
    coin2 = 0
    while coin1 == coin2:
        coin1 = unfairCoin()
        coin2 = unfairCoin()
    return coin1
于 2016-10-13T06:45:21.233 に答える