The Monty Hall problem

To solve the Monty Hall problem, I’ll define a new class:

class Monty(Pmf):

    def __init__(self, hypos):
        for hypo in hypos:
            self.Set(hypo, 1)

So far Monty and Cookie are exactly the same. And the code that creates the Pmf is the same, too, except for the names of the hypotheses:

    hypos = 'ABC'
    pmf = Monty(hypos)

Calling Update is pretty much the same:

    data = 'B'

And the implementation of Update is exactly the same:

    def Update(self, data):
        for hypo in self.Values():
            like = self.Likelihood(data, hypo)
            self.Mult(hypo, like)

The only part that requires some work is Likelihood:

    def Likelihood(self, data, hypo):
        if hypo == data:
            return 0
        elif hypo == 'A':
            return 0.5
            return 1

Finally, printing the results is the same:

    for hypo, prob in pmf.Items():
        print hypo, prob

And the answer is

A 0.333333333333
B 0.0
C 0.666666666667

In this example, writing Likelihood is a little complicated, but the framework of the Bayesian update is simple. The code in this section is available from For more information see Working with the code.

Get Think Bayes now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.