- vừa được xem lúc

Xác suất một nửa từ đồng xu không cân đối

0 0 35

Người đăng: Nhat Bui

Theo Viblo Asia

Một đồng xu gồm hai mặt: head và tail. Khi gieo một đồng xu, chúng ta chỉ thấy được một trong hai mặt ngửa lên, hoặc là head, hoặc là tail (giả sử đồng xu rơi xuống sẽ nằm chứ không đứng :Đ). Vì có hai khả năng trên xảy ra nên không gian mẫu của chúng ta là Ω\Omega = {head, tail}.

Đồng xu cân đối, theo định nghĩa cổ điển của xác suất, là đồng xu khi gieo có xác suất (ngửa) mặt head và tail bằng nhau:

Pr[head]=Pr[tail]=1Ω=12.\Pr[head] = \Pr[tail] = \frac{1}{|\Omega|} = \frac{1}{2}.

Nếu đồng xu không cân đối thì sao? Liệu có cách nào để gieo với xác suất một nửa mỗi mặt như đồng xu cân đối không?

Thuật toán đơn giản

Dĩ nhiên, ta giả sử rằng cả hai mặt đều có khả năng xuất hiện, tức Pr[head]>0\Pr[head] > 0Pr[tail]>0\Pr[tail] > 0. Vì xác suất một trong hai bằng zero thì chỉ việc ngồi phán chứ tính toán chi cho hói trán.

John von Neumann có nghĩ ra một cách thế này: gieo đồng xu không cân đối hai lần; nếu kết quả hai lần gieo khác nhau thì lấy kết quả lần một, nếu giống nhau thì bỏ qua hai kết quả này và gieo lại từ đầu. Thuật toán viết bằng Python như sau:

def neumann_flip(): x = weird_flip() y = weird_flip() if x != y: return x else: return neumann_flip()

Ta có hai quan sát nhỏ:

  • Cụ Neumann cóc quan tâm đồng xu lệch cỡ nào.
  • Thuật toán về căn bản có thể chạy mãi mãi, vì không tồn tại big-Oh cho trường hợp xấu nhất.

Đơn giản! Nhưng đơn giản không có nghĩa là dễ.

Practice

Để “thí nghiệm” thuật toán trên, ta cần định nghĩa hàm weird_flip():

from random import randint def weird_flip(): x = randint(1, 3) if x % 2 == 0: return 0 else: return 1
  • Giá trị 0 được trả về nếu random ra số chẵn, kí hiệu cho mặt head
  • Giá trị 1 được trả về nếu random ra số lẻ, kí hiệu cho mặt tail.
  • Chúng ta random trong đoạn [1,3][1, 3] nên xác suất random số lẻ là 2/32/3, điều này tạo ra đồng xu không cân đối.

Ta thí nghiệm weird_flip() với 1000 lần gieo:

trials = 1000
flipping = [weird_flip() for i in range(trials)]
# Tổng của flipping chính là số lần gieo được số lẻ
print(sum(flipping) / trials)

0.674

Kết quả xấp xỉ 2/32/3 như dự định. Thay weird_flip() bằng neumann_flip():

0.507

Xấp xỉ 1/21/2, cũng như dự định, nhưng là dự định xác suất của đồng xu cân đối :Đ. Magic!

Cần một lời giải thích

Tôi không rõ cụ Neuman đã chứng minh thuật toán ra sao. Nhưng có ra sao đi nữa thì chúng ta vẫn cần đọc lại lý thuyết về xác suất :Đ.

Một ít lý thuyết xác suất

  • Tổng: i=1ΩPr[Ai]=1AiΩ\sum_{i = 1}^{|\Omega|} \Pr[A_i] = 1 \quad \forall A_i \in \Omega.

  • Độc lập: Hai biến cố AABB độc lập khi và chỉ khi Pr[AB]=Pr[A]Pr[B]\Pr[A \wedge B] = \Pr[A] \cdot \Pr[B].

  • Xác suất điều kiện: Xác suất xảy ra AA khi BB đã xảy ra là

Pr[A  B]=Pr[AB]Pr[B].\Pr[A \ | \ B] = \frac{\Pr[A \wedge B]}{\Pr[B]}.

Chứng minh

Gọi xác suất gieo mặt head là pp, xác suất gieo mặt tail là q=1pq = 1 - p. (Lưu ý rằng ta đã giả sử rằng cả hai mặt đều có khả năng xuất hiện ở phần trước, do đó pq0pq \neq 0.)

Xét hàm neumann_flip(), hai lần gieo độc lập với nhau, ta có:

Pr[x=0y=1]=Pr[x=1y=0]=pq.\Pr[x=0 \wedge y=1] = \Pr[x=1 \wedge y=0] = pq.

Từ phương trình trên dễ nhận thấy

Pr[xy]=Pr[x=0y=1]+Pr[x=1y=0]=2pq.\Pr[x \neq y] = \Pr[x=0 \wedge y=1] + \Pr[x=1 \wedge y=0] = 2pq.


Rõ ràng khi gieo được x=0x = 0y=1y = 1 hay ngược lại, thì kéo theo xx hiển nhiên khác yy. Do đó:

Pr[x=0y=1xy]=Pr[x=1y=0xy]=pq.\Pr[x=0 \wedge y=1 \wedge x \neq y] = \Pr[x=1 \wedge y=0 \wedge x \neq y] = pq.

Sử dụng công thức xác suất điều kiện với x=0x = 0y=1y = 1:

Pr[x=0y=1  xy]=Pr[x=0y=1xy]Pr[xy]=pq2pq=12.\Pr[x=0 \wedge y=1 \ | \ x \neq y] = \frac{\Pr[x=0 \wedge y=1 \wedge x \neq y]}{\Pr[x \neq y]} = \frac{pq}{2pq} = \frac{1}{2}.

Pr[x=1y=0  xy]\Pr[x=1 \wedge y=0 \ | \ x \neq y] cũng nhận được kết quả 1/21/2.

Giá trị hàm trả về, xx (hoặc yy nếu ta muốn), được phân phối đồng bộ. Vì các lần gieo độc lập với nhau nên đệ quy cũng tương tự.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thuật toán quay lui (Backtracking)

Quay lui là một kĩ thuật thiết kế giải thuật dựa trên đệ quy. Ý tưởng của quay lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ quy.

0 0 51

- vừa được xem lúc

Các thuật toán cơ bản trong AI - Phân biệt Best First Search và Uniform Cost Search (UCS)

Nếu bạn từng đọc các thuật toán trong AI (Artificial Intelligence - Trí tuệ nhân tạo), rất có thể bạn từng nghe qua về các thuật toán tìm kiếm cơ bản: UCS (thuộc chiến lược tìm kiếm mù) và Best First Search (thuộc chiến lược tìm kiếm kinh nghiệm). Khác nhau rõ từ khâu phân loại rồi, thế nhưng hai th

0 0 169

- vừa được xem lúc

Sử dụng vector trong lập trình C++ - giải bài toán lập trình muôn thủa

Chào buổi tối mọi người, hôm nay lang thang trên mạng bắt gặp bài toán quen thuộc một thời của quãng đường sinh viên IT. Đấy chính là câu số 1 trong đề thi dưới đây:.

0 0 54

- vừa được xem lúc

MÔ PHỎNG THUẬT TOÁN VƯƠNG HẠO TRONG PROLOG

. 1. Các luật suy diễn trong thuật toán Vương Hạo. Luật 1: Chuyển vế các giả thuyết và kết luận ở dạng phủ định. Ví dụ: p v q, !(r ^ s), !q, p v r -> s, !p <=> p v q, p v r, p -> s, r ^ s, q.

0 0 89

- vừa được xem lúc

A* Search Algorithm

What is A* Search Algorithm. How it works. . Explanation.

0 0 58

- vừa được xem lúc

Python: Jump Search

Search là một từ khóa khá là quen thuộc đối với chúng ta. Hiểu theo đúng nghĩa đen của nó chính là "Tìm kiếm".

0 0 50