ได้รับเหรียญที่มีอคติที่ไม่รู้จักว่าฉันสามารถสร้าง variates - อย่างมีประสิทธิภาพเป็นไปได้ - ที่ Bernoulli กระจายกับความน่าจะเป็น 0.5? นั่นคือใช้จำนวนขั้นต่ำของการพลิกต่อการเปลี่ยนแปลงที่สร้างขึ้น
ได้รับเหรียญที่มีอคติที่ไม่รู้จักว่าฉันสามารถสร้าง variates - อย่างมีประสิทธิภาพเป็นไปได้ - ที่ Bernoulli กระจายกับความน่าจะเป็น 0.5? นั่นคือใช้จำนวนขั้นต่ำของการพลิกต่อการเปลี่ยนแปลงที่สร้างขึ้น
คำตอบ:
นี่เป็นปัญหาที่รู้จักกันดีกับวิธีแก้ปัญหาที่ดีหลายอย่างซึ่งถูกกล่าวถึงที่นี่และใน stackoverflow (ดูเหมือนว่าฉันไม่สามารถโพสต์มากกว่าหนึ่งลิงก์ แต่การค้นหา google อย่างรวดเร็วช่วยให้คุณมีรายการที่น่าสนใจ) ดูที่รายการวิกิพีเดีย
http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin
นี่เป็นปัญหาคลาสสิกฉันเชื่อว่ามาจาก von Neumann ทางออกหนึ่งคือการเก็บเหรียญเป็นคู่จนกว่าคู่จะแตกต่างกันจากนั้นเลื่อนไปที่ผลลัพธ์ของเหรียญแรกในคู่
ให้อย่างชัดเจนเป็นผลลัพธ์ของการทอยโดยเป็นเหรียญแรกและเป็นเหรียญที่สอง แต่ละเหรียญมีความน่าจะเป็นของหัว แล้วเนื่องจากสมมาตรซึ่งหมายถึง1/2 หากต้องการดูข้อความที่สมมาตรนี้อย่างชัดเจนว่าหมายถึงผลลัพธ์คือหรือซึ่งทั้งคู่มีความเป็นไปได้อย่างเท่าเทียมกันเนื่องจากความเป็นอิสระi X i Y ฉัน p P ( X i = H | X i ≠ Y i ) = P ( X i = T | X i ≠ Y i ) P ( X i = H | X i ≠ Y ฉัน ) = 1 / 2 X ฉัน ≠ Y ( H , T ) ( T , H )
สังเกตุเวลาที่รอจนกว่าคู่ที่ไม่เท่ากันจะเป็นเช่นนั้น
ซึ่งระเบิดขึ้นเมื่อเข้าใกล้ 0 หรือ 1 (ซึ่งสมเหตุสมผล)
ntn′t′ ( n′
เพื่อแสดง:
เราสามารถหยุดที่ TH หรือ HT เนื่องจากสิ่งเหล่านี้มีความน่าจะเป็นที่เท่ากัน การย้ายสามเหลี่ยมของปาสคาลคำศัพท์ถัดไปนั้นอยู่ในแถวที่สี่: 4, 6, 4 หมายความว่าเราสามารถหยุดหลังจากม้วนถ้ามีหัวหนึ่งอันเกิดขึ้นเนื่องจากเราสามารถสร้างการจับคู่แบบสองฝ่าย: HHHT กับ HHTH และเทคนิค HTHH ด้วย THHH แม้ว่าเราจะหยุดพวกมันไปแล้ว ในทำนองเดียวกันให้ผลที่ตรงกันกับ TTHH (ที่เหลือเราจะหยุดก่อนที่จะไปถึงพวกเขา)
สำหรับลำดับทั้งหมดได้หยุดคำนำหน้า มันน่าสนใจกว่าที่ที่เราจับคู่ FFFFTTFT กับ FFFFTTTF( 8)
สำหรับหลังจาก 8 ม้วนโอกาสที่ไม่ได้มีการหยุดเป็นมีจำนวนที่คาดหวังของม้วนถ้าเราได้หยุดของ{16} สำหรับวิธีการแก้ปัญหาที่เราเก็บคู่กลิ้งไว้จนกว่าพวกเขาจะแตกต่างกันโอกาสที่จะไม่หยุดคือโดยมีจำนวนม้วนที่คาดไว้ถ้าเราหยุด 4 จากการเรียกซ้ำมีขอบเขตบนพลิกที่คาดไว้ สำหรับขั้นตอนวิธีการที่นำเสนอคือ<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