Thủ tục tới produce an unbiased coin from a biased one lần đầu tiên được gán cho Von Neumann (một người đã thực hiện công việc rất lớn trong môn toán và nhiều lĩnh vực liên quan). Quy trình này rất đơn giản:
- Toss xu hai lần.
- Nếu kết quả phù hợp, hãy bắt đầu lại, quên cả hai kết quả.
- Nếu kết quả khác nhau, hãy sử dụng kết quả đầu tiên, hãy quên kết quả thứ hai.
Lý do thuật toán này hoạt động là do xác suất nhận được HT là p(1-p)
, giống như nhận được TH (1-p)p
. Vì vậy, hai sự kiện đều có khả năng như nhau.
Tôi cũng đang đọc sách này và nó sẽ hỏi thời gian chạy dự kiến. Xác suất hai lần tung không bằng nhau là z = 2*p*(1-p)
, do đó thời gian chạy dự kiến là 1/z
.
Ví dụ trước đây trông đáng khích lệ (sau khi tất cả, nếu bạn có một đồng xu thiên vị với một sự thiên vị của p=0.99
, bạn sẽ cần phải ném đồng xu của bạn khoảng 50 lần, mà không phải là nhiều). Vì vậy, bạn có thể nghĩ rằng đây là một thuật toán tối ưu. Đáng buồn thay nó không phải là.
Dưới đây là cách so sánh với Shannon's theoretical bound (hình ảnh được chụp từ answer) này. Nó cho thấy rằng thuật toán là tốt, nhưng xa tối ưu.

Bạn có thể đưa ra một sự cải tiến nếu bạn sẽ xem xét rằng HHTT sẽ bị loại bỏ bởi thuật toán này, nhưng trên thực tế nó có khả năng tương tự như TTHH. Vì vậy, bạn cũng có thể dừng lại ở đây và trở lại H. Điều tương tự là với HHHHTTTT và vân vân. Sử dụng những trường hợp này cải thiện thời gian chạy dự kiến, nhưng không làm cho nó tối ưu về mặt lý thuyết.
Và vào cuối - Mã python:
import random
def biased(p):
# create a biased coin
return 1 if random.random() < p else 0
def unbiased_from_biased(p):
n1, n2 = biased(p), biased(p)
while n1 == n2:
n1, n2 = biased(p), biased(p)
return n1
p = random.random()
print p
tosses = [unbiased_from_biased(p) for i in xrange(1000)]
n_1 = sum(tosses)
n_2 = len(tosses) - n_1
print n_1, n_2
Nó là khá tự giải thích, và đây là một kết quả ví dụ:
0.0973181652114
505 495
Như bạn thấy, tuy nhiên chúng tôi đã có thiên vị của 0.097
, chúng tôi có cùng số lượng 1
và 0
Tôi đoán câu trả lời phải làm với việc sử dụng máy phát thiên vị một cách tiêu chuẩn và một lần như một hàm nghịch đảo sao cho bạn có xác suất ap của xác suất 0 một lần và một (1-p) của 0 lần lặp thứ hai và trộn hai kết quả để cân bằng phân phối. Tôi không biết toán học chính xác đằng sau nó mặc dù. –
Eric- vâng, nếu bạn đã làm (rand() + (1-rand()))/2, bạn có thể hợp lý mong đợi để có được một kết quả không thiên vị. Lưu ý rằng ở trên bạn nên gọi rand() hai lần - nếu không bạn chỉ cần luôn luôn nhận được.5 – JohnE
@JohnE: Về cơ bản đó là những gì tôi đã suy nghĩ, nhưng điều đó không để lại cho bạn một thẳng 0 hoặc 1, được yêu cầu. Tôi nghĩ rằng pau nhấn móng tay trên đầu với câu trả lời của mình. –