Làm thế nào để lập trình mô phỏng Monte Carlo về nghịch lý hộp của Bertrand?


12

Vấn đề sau đây đã được đăng trên Trang Facebook của Mensa International:

nhập mô tả hình ảnh ở đây

Bản thân bài đăng đã nhận được hơn 1000 bình luận nhưng tôi sẽ không đi sâu vào chi tiết về cuộc tranh luận ở đó vì tôi biết đây là nghịch lý hộp của Bertrand và câu trả lời là 23 . Điều khiến tôi quan tâm ở đây là làm thế nào để một người trả lời vấn đề này bằng cách sử dụng phương pháp Monte Carlo? Làm thế nào là thuật toán để giải quyết vấn đề này?

Đây là nỗ lực của tôi:

  1. Tạo số ngẫu nhiên phân bố đồng đều từ đến .0 1N01
  2. Đặt sự kiện của hộp chứa 2 quả bóng vàng (hộp 1) được chọn nhỏ hơn một nửa.
  3. Đếm những con số mà ít hơn và gọi kết quả như S .0,5S
  4. Vì chắc chắn có được quả bóng vàng nếu hộp 1 được chọn và chỉ có 50% cơ hội nhận được quả bóng vàng nếu hộp 2 được chọn, do đó xác suất nhận được chuỗi GG là
    P(B2= =G|B1= =G)= =SS+0,5(N-S)

Thực hiện thuật toán trên trong R:

N <- 10000
S <- sum(runif(N)<0.5)
S/(S+0.5*(N-S))

Đầu ra của chương trình ở trên là khoảng gần như khớp với câu trả lời đúng nhưng tôi không chắc đây là cách chính xác. Có một cách thích hợp để giải quyết vấn đề này theo chương trình?0,67

Câu trả lời:


14

Giống như @Henry , tôi không thực sự cảm thấy rằng giải pháp của bạn là Monte Carlo. Chắc chắn, bạn lấy mẫu từ bản phân phối, nhưng nó không liên quan gì đến việc bắt chước quy trình tạo dữ liệu. Nếu bạn muốn sử dụng Monte Carlo để thuyết phục ai đó rằng giải pháp lý thuyết là chính xác, bạn sẽ cần sử dụng giải pháp bắt chước quy trình tạo dữ liệu. Tôi sẽ tưởng tượng nó là một cái gì đó như dưới đây:

boxes <- list(
  c(0, 0),
  c(0, 1),
  c(1, 1)
)

count_successes = 0
count_valid_samples = 0

for (i in 1:5000) {
  sampled_box <- unlist(sample(boxes, 1)) # sample box
  sampled_balls <- sample(sampled_box)    # shuffle balls in the box

  if (sampled_balls[1] == 1) {            # if first ball is golden
    if (sampled_balls[2] == 1) {          # if second ball is golden
      count_successes = count_successes + 1
    }
    count_valid_samples = count_valid_samples + 1
  }
}
count_successes / count_valid_samples

hoặc sử dụng mã "vectorized":

mean(replicate(5000, {       # repeat 5000 times, next calculate empirical probability
  x <- boxes[[sample(3, 1)]] # pick a box
  if (x[sample(2, 1)] == 1)  # pick a ball, check if it is golden
    return(sum(x) == 2)      # check if you have two golden balls in the box
  else
    return(NA)               # ignore if sampled ball is silver
  }), na.rm = TRUE)          # not count if silver

Lưu ý rằng vì bạn cho rằng thực tế là quả bóng đầu tiên đã được rút ra và nó là vàng, vì vậy đoạn mã trên có thể chỉ cần sử dụng hai hộp boxes <- list(c(0, 1), c(1, 1))và sau đó lấy mẫu từ chúng x <- boxes[[sample(2, 1)]], vì vậy mã sẽ nhanh hơn vì nó sẽ không tạo ra 1/3 chạy trống mà chúng tôi giảm giá. Tuy nhiên, vì vấn đề rất đơn giản và mã chạy nhanh, chúng tôi có thể đủ khả năng mô phỏng rõ ràng toàn bộ quá trình tạo dữ liệu "để chắc chắn" rằng kết quả là chính xác. Bên cạnh đó, bước này không cần thiết vì nó sẽ mang lại kết quả tương tự trong cả hai trường hợp.


x <- boxes[[sample(3, 1)]]nghĩa là bạn lấy một hộp từ 3 hộp? Nếu vậy, tại sao cần thiết vì chúng tôi biết bạn đã chọn một quả bóng vàng?
Anastasiya-Romanova

7
@ Anastasiya-Romanova秀bạn có thể thay vì mẫu từ hai hộp boxes <- list(c(0, 1), c(1, 1))và sau đó x <- boxes[[sample(2, 1)]], nhưng vì đây là hầu hết thời gian tính toán tương tự, tại sao không sử dụng các bước bổ sung mà chính xác giống như quá trình lấy mẫu? Nó không thay đổi bất cứ điều gì về kết quả, nhưng làm cho mô phỏng rõ ràng.
Tim

Được rồi Tim, cảm ơn câu trả lời của bạn. Hãy cho tôi thời gian để hiểu câu trả lời của bạn trước vì tôi khá mới trong R. Hiện tại, +1 cho bạn & @Henry.
Anastasiya-Romanova

1
@ Anastasiya-Romanova 秀 đúng, chính xác. Mã lấy mẫu một hộp, sau đó lấy mẫu một quả bóng từ hộp, nếu nó là vàng (= 1) thì nó sẽ kiểm tra xem quả bóng khác từ hộp đó có phải là vàng không (1 + 1 = 2), nếu có thì nó sẽ đếm và cuối cùng, nó chia tổng cho tổng số (tức là sử dụng mean).
Tim

1
@ Anastasiya-Romanova 秀return(NA)trả về giá trị bị thiếu và sau đó mean(, na.rm = TRUE)được sử dụng, trong đó na.rm = TRUEđối số cho biết hàm bỏ qua các giá trị bị thiếu. Trong các ngôn ngữ lập trình khác, điều này có thể được thực hiện khác nhau, ví dụ như sử dụng continuehoặc passtừ khóa.
Tim

4

Tôi cảm thấy S/(S+0.5*(N-S))tính toán của bạn không thực sự mô phỏng

Hãy thử một cái gì đó như thế này

N <- 10^6
ballsinboxes <- c("G","G", "G","S", "S","S")
selectedbox <- sample(c(1,2,3), N, replace=TRUE)
selectedball <- sample(c(1,2), N, replace=TRUE)
selectedcolour <- ballsinboxes[(selectedbox-1)*2 + selectedball ]
othercolour <- ballsinboxes[(selectedbox-1)*2 + 3 - selectedball ]
sum(selectedcolour == "G" & othercolour == "G") / sum(selectedcolour == "G")

-2

Tại sao không chỉ đơn giản là liệt kê các trường hợp?

Ở đây: G dành cho "vàng", S là "bạc", vốn dành cho khai thác ban đầu:

Gg

gG

Gs

... tất cả các trường hợp khác đều yêu cầu khai thác bạc (S) ban đầu và không thỏa mãn điều kiện (trích xuất ban đầu G).

Chẳng hạn, P (g | G) = 2/3.


7
Câu hỏi hỏi về giải pháp Monte Carlo.
Tim

Chà, liệt kê TẤT CẢ các khả năng là một trường hợp cực đoan của Monte Carlo.
ghuezt

4
Không, không phải vậy, Monte Carlo là về mô phỏng / ngẫu nhiên.
Tim

Tim, có được toán học của bạn ngay. Với vô số lần rút thăm, bạn sẽ có được một danh sách chính xác tất cả các trường hợp có xác suất bằng nhau. Tôi buồn "trường hợp cực đoan" và có nghĩa là giới hạn.
ghuezt

1
Chắc chắn, nhưng liệt kê tất cả các trường hợp không phải là Monte Carlo. Hình vuông là hình chữ nhật, nhưng hình chữ nhật không phải là hình vuông.
Tim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.