วิธีตั้งโปรแกรมการจำลอง Monte Carlo ของกล่องเส้นขนานของ Bertrand ได้อย่างไร


12

ปัญหาต่อไปนี้ได้รับการโพสต์ในหน้า Facebook ของ Mensa International:

ป้อนคำอธิบายรูปภาพที่นี่

โพสต์นั้นได้รับความคิดเห็นมากกว่า 1,000 ข้อ แต่ฉันจะไม่ลงรายละเอียดเกี่ยวกับการอภิปรายที่นั่นเพราะฉันรู้ว่านี่คือกล่องความขัดแย้งของเบอร์ทรานด์และคำตอบคือ . สิ่งที่ทำให้ฉันสนใจที่นี่คือหนึ่งจะตอบปัญหานี้โดยใช้วิธีการ Monte Carlo ได้อย่างไร อัลกอริทึมเป็นวิธีการแก้ปัญหานี้อย่างไร23

นี่คือความพยายามของฉัน:

  1. สร้างกระจายอย่างสม่ำเสมอตัวเลขสุ่มระหว่าง0และ1N01
  2. ให้เหตุการณ์ของกล่องมี 2 ลูกทองคำ (กล่อง 1) เลือกน้อยกว่าครึ่ง
  3. 0.5S
  4. 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

หรือใช้รหัส "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

โปรดสังเกตว่าเนื่องจากสภาพของคุณที่ลูกบอลลูกแรกถูกดึงไปแล้วและมันเป็นสีทองดังนั้นโค้ดข้างต้นสามารถใช้สองกล่องboxes <- list(c(0, 1), c(1, 1))จากนั้นสุ่มตัวอย่างจากพวกเขาx <- boxes[[sample(2, 1)]]ดังนั้นรหัสจะเร็วขึ้นเนื่องจากจะไม่ทำให้ 1/3 วิ่งเปล่า ๆ ที่เราลดราคา อย่างไรก็ตามเนื่องจากปัญหานั้นง่ายและรหัสทำงานได้อย่างรวดเร็วเราจึงสามารถจำลองกระบวนการสร้างข้อมูลทั้งหมดได้อย่างชัดเจนเพื่อให้แน่ใจว่าผลลัพธ์นั้นถูกต้อง นอกจากนั้นขั้นตอนนี้ไม่จำเป็นเนื่องจากจะให้ผลลัพธ์ที่เหมือนกันในทั้งสองกรณี


ไม่x <- boxes[[sample(3, 1)]]ได้หมายความว่าคุณจะใช้กล่องจาก 3 กล่อง? ถ้าเป็นเช่นนั้นทำไมมันถึงจำเป็นเพราะเรารู้จักคุณเลือกลูกบอลทองคำ?
Anastasiya-Romanova 秀

7
@ Anastasiya-Romanova秀คุณสามารถแทนตัวอย่างจากสองกล่องboxes <- list(c(0, 1), c(1, 1))แล้วx <- boxes[[sample(2, 1)]]แต่ตั้งแต่นี้เกือบจะเป็นเวลาในการคำนวณเดียวกันทำไมไม่ใช้ขั้นตอนพิเศษที่ว่ามีลักษณะคล้ายกับกระบวนการสุ่มตัวอย่าง? มันไม่ได้เปลี่ยนแปลงอะไรเกี่ยวกับผลลัพธ์ แต่ทำให้การจำลองชัดเจน
ทิม

ทิมเอาล่ะขอบคุณสำหรับคำตอบของคุณ ให้เวลาฉันเข้าใจคำตอบของคุณก่อนเพราะฉันค่อนข้างใหม่ใน R สำหรับตอนนี้ +1 สำหรับคุณ & @Henry
Anastasiya-Romanova 秀

1
@ Anastasiya-Romanova 秀ใช่แน่นอน รหัสตัวอย่างกล่องจากนั้นสุ่มตัวอย่างลูกบอลจากกล่องถ้าเป็นทอง (= 1) มันจะตรวจสอบว่าบอลอีกกล่องจากนั้นเป็นทองคำ (1 + 1 = 2) ถ้าใช่มันจะนับและ ในท้ายที่สุดมันหารผลรวมด้วยการนับทั้งหมด (เช่นใช้mean)
ทิม

1
@ Anastasiya-Romanova 秀return(NA)คืนค่าที่หายไปจากนั้นmean(, na.rm = TRUE)นำไปใช้โดยที่na.rm = TRUEอาร์กิวเมนต์บอกให้ฟังก์ชันละเว้นค่าที่หายไป ในภาษาการเขียนโปรแกรมอื่น ๆ สิ่งนี้สามารถทำได้แตกต่างกันเช่นการใช้continueหรือpassคำหลัก
ทิม

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 เกี่ยวกับการจำลอง / การสุ่ม
ทิม

ทิมเข้าใจคณิตศาสตร์ของคุณ ด้วยการเสมอจำนวนมากคุณจะได้รับรายชื่อของทุกกรณีที่มีความน่าจะเป็นที่เท่ากัน ฉันเสียใจ "กรณีที่รุนแรง" และหมายถึงขีด จำกัด
ghuezt

1
แน่นอน แต่การแสดงรายการทุกกรณีไม่ใช่ Monte Carlo Square เป็นสี่เหลี่ยม แต่สี่เหลี่ยมผืนผ้าไม่ใช่สี่เหลี่ยม
ทิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.