바이어스 가 알려지지 않은 동전이 주어지면 Bernoulli 분포가 0.5 인 확률을 가능한 한 효율적으로 생성 할 수 있습니까? 즉, 생성 된 변수 당 최소 플립 수를 사용합니다.
바이어스 가 알려지지 않은 동전이 주어지면 Bernoulli 분포가 0.5 인 확률을 가능한 한 효율적으로 생성 할 수 있습니까? 즉, 생성 된 변수 당 최소 플립 수를 사용합니다.
답변:
이것은 여기에서 논의되고 스택 오버 플로우에서 논의 된 몇 가지 훌륭한 솔루션의 잘 알려진 문제입니다 (하나 이상의 링크를 게시 할 수는 없지만 빠른 Google 검색은 흥미로운 항목을 제공합니다). 위키 백과 항목을보십시오
http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin
ntn't' ( n'
설명하기 위해 :
TH 또는 HT에서 동일한 확률을 가지므로 멈출 수 있습니다. 파스칼의 삼각형을 따라 내려 가면 다음 짝수 항은 4, 6, 4입니다. 두 부분 일치를 만들 수 있기 때문에 헤드 하나가 나오면 롤 후 멈출 수 있음을 의미합니다. 우리가 이미 그 일을 중단했을 것입니다. 마찬가지로 는 TTHH와 일치하는 HHTT를 생성합니다 (나머지는 도달하기 전에 이미 중지 했음).
를 들어 , 시퀀스의 모든 접두사를 중단했다. 에서 FFFFTTFT와 FFFFTTTF를 일치시키는 것이 조금 더 흥미로워 집니다.( 8
들면 8 롤 후 정지 갖지 않는 기회이다 우리가 정지 한 경우 롤의 예상 된 수와 . 롤링 쌍이 서로 다를 때까지 롤링을 유지하는 솔루션의 경우 중지하지 않을 가능성은 이며 롤이 4를 멈춘 경우 예상 롤 수입니다. 재귀에 의해 예상되는 플립의 상한 제시된 알고리즘은 입니다. 1 53 1 128
중단 점을 인쇄하는 Python 프로그램을 작성했습니다.
import scipy.misc
from collections import defaultdict
bins = defaultdict(list)
def go(depth, seq=[], k=0):
n = len(seq)
if scipy.misc.comb(n, k, True) % 2 == 0:
bins[(n,k)].append("".join("T" if x else "F"
for x in seq))
return
if n < depth:
for i in range(2):
seq.append(i)
go(depth, seq, k+i)
seq.pop()
go(8)
for key, value in sorted(bins.items()):
for i, v in enumerate(value):
print(v, "->", "F" if i < len(value) // 2 else "T")
print()
인쇄물:
FT -> F
TF -> T
FFFT -> F
FFTF -> T
FFTT -> F
TTFF -> T
TTFT -> F
TTTF -> T
FFFFFT -> F
FFFFTF -> T
TTTTFT -> F
TTTTTF -> T
FFFFFFFT -> F
FFFFFFTF -> T
FFFFFFTT -> F
FFFFTTFF -> T
FFFFTTFT -> F
FFFFTTTF -> T
FFFFTTTT -> F
TTTTFFFF -> T
TTTTFFFT -> F
TTTTFFTF -> T
TTTTFFTT -> F
TTTTTTFF -> T
TTTTTTFT -> F
TTTTTTTF -> T