2016-11-02 7 views
1

Monty Hall問題のシミュレーションを作成しましたが、私の結果(10,000,000回のテストでも)は異常です。戦略1(維持)のヒット数は1/3、戦略2(スイッチ)は44,44%です。コードに誤りがありますか?Monty Hallシミュレーションのみ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))") 
+7

あなたはMonty Hall問題のルールを誤解しました。モンティはドアを開けません。あなたはそれをチェックしませんでした。 – kennytm

答えて

2

モンティ・ホール問題がドアを選ぶ」と言い、私はそれを開く前に、私は他のドア(車を持っていないもの)の一つ後ろに何を示して、あなたはあなたの初期に滞在もらおう選択またはもう一方の閉じたドアに切り替える」。

しかし、考えてみます。

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/3rdsに上がります。

+0

偉大な、ありがとう、間違いがあった! – Swifty

関連する問題