我刚刚为monty-hall问题创建了一个模拟,但是我的结果(即使有10000000个测试)很奇怪。策略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的问题是“选择一个门;在我打开它之前,我将显示另一个门(一个没有车的门)后面的内容,并让您保留最初的选择或切换到另一个关闭的门”。
但考虑一下:

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。

10-04 18:24