【问题标题】:Monty Hall simulation only 44%Monty Hall 模拟仅 44%
【发布时间】:2016-11-03 01:20:26
【问题描述】:

我刚刚为蒙蒂霍尔问题创建了一个模拟,但我的结果(即使有 10,000,000 次测试)很奇怪。对于策略 1(保持),命中率为 1/3,策略 2(切换)为 44.44%。代码有错误吗?

谢谢大家!

var hits1 = 0
var hits2 = 0
let testsNumber = 1000

for i in 0..<testsNumber {

    var doors: [Int] = []

    for i in 0..<3 {
        doors.append(0) // Append closed door
    }

    doors[Int(arc4random_uniform(UInt32(doors.count)))] = 1 // Here's the car...        
    var selection = Int(arc4random_uniform(UInt32(doors.count))) // Select door


    if doors[selection] == 1 {
        hits1 += 1
    }

    // Open first closed door
    for i in 0..<doors.count {
        if doors[i] != 1 {
            doors[i] = -1 // Open door
            break
        }
    }

    // Switch to next closed door
    repeat {
        selection = (selection + 1) % doors.count 
    } while(doors[selection] == -1)

    if doors[selection] == 1 {
        hits2 += 1
    }

}

print("Hits: \(hits1), quote: \((Double) (hits1) / (Double) (testsNumber))")
print("Hits: \(hits2), quote: \((Double) (hits2) / (Double) (testsNumber))")

【问题讨论】:

  • 你误解了Monty Hall问题的规则。 Monty 不会打开door[selection],而您没有对此进行检查。

标签: swift math simulation


【解决方案1】:

Monty Hall 问题说“选择一扇门;在我打开它之前,我会展示其他一扇门(没有车的门)后面的东西,让您保留最初的选择或切换到另一扇紧闭的门”。

但是考虑一下:

for i in 0 ..< doors.count {
    if doors[i] != 1 {
        doors[i] = -1 // Open door
        break
    }
}

这实际上是说“向参赛者展示没有汽车的第一扇门后面是什么”。

但是,您没有考虑这扇门可能是参赛者已经选择的那扇门的可能性。那就是改变游戏的参数。

您的意思是“打开一扇没有车且不是参赛者选择的门的门。”

for i in 0 ..< doors.count {
    if doors[i] != 1 && i != selection {
        doors[i] = -1 // Open door
        break
    }
}

当您这样做时,通过始终更改您的选择(已显示其他两个没有车的门之一),您的几率会上升到 2/3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多