เช่น@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 กล่อง? ถ้าเป็นเช่นนั้นทำไมมันถึงจำเป็นเพราะเรารู้จักคุณเลือกลูกบอลทองคำ?