Bertrand의 박스 역설에 대한 Monte Carlo 시뮬레이션을 프로그래밍하는 방법?


12

다음 문제점이 Mensa International Facebook 페이지에 게시되었습니다 :

여기에 이미지 설명을 입력하십시오

게시물 자체는 1000 개 이상의 댓글을 받았지만 이것이 Bertrand의 상자 역설 이며 답은 이므로 토론에 대한 자세한 내용은 . 여기서 내가 관심을 갖는 것은 Monte Carlo 접근법을 사용하여이 문제에 어떻게 대답 하는가? 알고리즘은이 문제를 어떻게 해결합니까?23

내 시도는 다음과 같습니다.

  1. 과 사이에 균일하게 분포 된 난수를 생성 합니다.0 1N01
  2. 상자 이벤트에 선택한 2 개의 금 공 (상자 1)이 절반 미만이되도록합니다.
  3. 보다 작은 수를 세고 결과를 라고합니다 .S0.5S
  4. 상자 1을 선택하면 금 구슬을 얻을 것이 확실하고 상자 2를 선택하면 금 구슬을 얻을 확률이 50 %이므로 시퀀스 GG를 얻을 확률은
    P(B2=G|B1=G)=SS+0.5(NS)

R에서 위의 알고리즘을 구현합니다.

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

위의 프로그램 출력은 약 이며 정답과 거의 일치하지만 이것이 올바른 방법인지 확실하지 않습니다. 프로그래밍 방식으로이 문제를 해결할 수있는 적절한 방법이 있습니까?0.67

답변:


14

@Henry 와 마찬가지로 귀하의 솔루션이 Monte Carlo라고 생각하지 않습니다. 분명히, 당신은 배포판에서 샘플링하지만 데이터 생성 프로세스를 모방하는 것과는별로 관련이 없습니다. Monte Carlo를 사용하여 이론적 인 솔루션이 올바르다는 것을 누군가에게 확신 시키려면 데이터 생성 프로세스를 모방하는 솔루션을 사용해야합니다. 나는 그것이 다음과 같은 것이라고 상상할 것입니다 :

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

또는 "벡터화 된"코드 사용 :

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

첫 번째 공이 이미 그려져 있고 황금색이라는 사실을 조건으로하므로 위의 코드는 단순히 두 개의 상자 boxes <- list(c(0, 1), c(1, 1))를 사용한 다음 샘플링 x <- boxes[[sample(2, 1)]]할 수 있으므로 1/3을 만들지 않기 때문에 코드가 더 빠릅니다. 우리가 할인하는 빈 실행. 그러나 문제가 간단하고 코드가 빠르게 실행되므로 전체 데이터 생성 프로세스를 명시 적으로 시뮬레이션하여 결과가 올바른지 "확실히"확인할 수 있습니다. 게다가이 단계는 두 경우 모두 동일한 결과를 생성하므로 필요하지 않습니다.


x <- boxes[[sample(3, 1)]]3 개의 상자에서 상자를 가져 오라는 의미입니까? 그렇다면 이미 금 공을 고른 것을 알고 왜 필요한가?
아나스타샤-로마 노바 秀

7
@ Anastasiya-Romanova 秀 대신 두 개의 상자에서 샘플링 boxes <- list(c(0, 1), c(1, 1))한 다음 x <- boxes[[sample(2, 1)]]거의 동일한 계산 시간이므로 샘플링 프로세스와 정확히 비슷한 추가 단계를 사용하지 않는 이유는 무엇입니까? 결과에 대한 내용은 변경하지 않지만 시뮬레이션을 명시 적으로 만듭니다.
Tim

알았어, 대답 해줘서 고마워 R에 상당히 익숙하지 않기 때문에 먼저 답을 이해할 시간을주세요. 지금은 +1입니다.
아나스타샤-로마 노바 秀

1
@ Anastasiya-Romanova 秀 그렇습니다. 코드는 상자를 샘플링 한 다음 상자에서 공을 샘플링합니다 (골드 (= 1) 인 경우 상자의 다른 공도 황금 (1 + 1 = 2)인지 확인한 경우 예인 경우 계수하고 결국 합계를 총 수로 나눕니다 (예 :) mean.

1
@ Anastasiya-Romanova 秀return(NA)는 결 측값을 반환 한 다음 인수를 mean(, na.rm = TRUE)사용 na.rm = TRUE하여 결 측값을 무시하도록 함수에 지시합니다. 다른 프로그래밍 언어에서는 예를 들어 continue또는 pass키워드를 사용하여 다르게 수행 할 수 있습니다 .
Tim

4

나는 당신의 기분이 S/(S+0.5*(N-S))계산이 정말 시뮬레이션 아니다

이런 식으로 해보십시오

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

단순히 사례를 나열하지 않는 이유는 무엇입니까?

여기에서 G는 "금", S는 "은", 자본은 초기 추출을위한 것입니다.

Gg

gG

Gs

... 다른 모든 경우에는 초기은 (S) 추출이 필요하며 조건부 (초기 추출 G)를 만족하지 않습니다.

이와 같이 P (g | G) = 2/3이다.


7
질문은 Monte Carlo 솔루션에 대해 묻습니다.

글쎄, 모든 가능성을 나열하는 것은 Monte Carlo의 극단적 인 경우입니다.
ghuezt

4
아닙니다, Monte Carlo는 시뮬레이션 / 랜덤 화에 관한 것입니다.
Tim

팀, 수학을 올바르게 해 무한히 많은 추첨으로 확률이 동일한 모든 사례의 목록을 정확하게 얻을 수 있습니다. 나는 "극단적 인 사건"이 슬프고 한계를 의미했다.
ghuezt

1
물론 모든 사례를 나열하는 것은 Monte Carlo가 아닙니다. 사각형은 사각형이지만 사각형은 사각형이 아닙니다.
Tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.