[R] Two envelopes problem

Daniel Nordlund djnordlund at verizon.net
Tue Aug 26 10:22:33 CEST 2008


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Mario
> Sent: Monday, August 25, 2008 1:51 PM
> To: Greg Snow; r-help at r-project.org
> Subject: Re: [R] Two envelopes problem
> 
> No, no, no. I have solved the Monty Hall problem and the Girl's problem
> and this is quite different. Imagine this, I get the envelope and I open
> it and it has £A (A=10 or any other amount it doesn't matter), a third
> friend gets the other envelope, he opens it, it has £B, now £B could be
> either £2A or £A/2. He doesn't know what I have, he doesn't have any
> additional information. According to your logic, he should switch, as he
> has a 50% chance of having £2B and 50% chance of having £B/2. But the
> same logic applies to me. In conclusion, its advantageous for both of us
> to switch. But this is a paradox, if I'm expected to make a profit, then
> surely he's expected to make a loss! This is why this problem is so
> famous. If you look at the last lines of my simulation, I get,
> conditional on the first envelope having had £10, that the second
> envelope has £5 approximatedly 62.6% of the time and 37.4% for the
> second envelope. In fact, it doesn't matter what the original
> distribution of money in the envelopes is, 

Yes it does.

>conditional on the first
> having £10, you should exactly see 2/3 of the second envelopes having £5
> and 1/3 having £20. 

How did you derive that "conditional on the first having £10, you should exactly see 2/3 of the second envelopes having £5 and 1/3 having £20"?  In particular, where did the 2/3 and 1/3 come from?  Using your function, generateenv(), I get an even distribution of £5 and £20 for an initial uniform distribution.

# use floor to get integer values 1:19
rintuniform <- function(n, ...) return (floor(runif(n, ...)))

env <- generateenv(r=2, rintuniform, 1e6, min=1, max=20)
mean(env[,1]) # you keep the randomly assigned first envelope
mean(env[,2]) # you always switch and keep the second 
i10 <- which(env[,1]==10)
mean(env[i10,1]) # Exactly 10
mean(env[i10,2]) # ~ 12.5

five <- which(env[i10,2]==5) # indices where second envelope=5
length(five)/length(i10) # proportion of first envelope=10
                                          # where second envelope=5

In the last lines of your simulation, your function, rintexp(), generates approximately twice as many 5's as 10's.  That is the source of your approximately 2 to 1 ratio of 5's and 20's in the second envelope, conditional on the first envelope containing 10.  As demonstrated above, if you start with a uniform distribution, the ratio of 5's and 20's in the second envelope, conditional on the first envelope containing 10, is 1:1.

>But I'm getting a slight deviation from this ratio,
> which is consistent, and I don't know why.
> 
> Cheers,
> Mario.
> 
> Greg Snow wrote:
> > You are simulating the answer to a different question.
> >
> > Once you know that one envelope contains 10, then you know conditional on that
> information that either x=10 and the other envelope holds 20, or 2*x=10 and the other
> envelope holds 5.  With no additional information and assuming random choice we
> can say that there is a 50% chance of each of those.  A simple simulation (or the math)
> shows:
> >
> >
> >> tmp <- sample( c(5,20), 100000, replace=TRUE )
> >> mean(tmp)
> >>
> > [1] 12.5123
> >
> > Which is pretty close to the math answer of 12.5.
> >
> > If you have additional information (you believe it unlikely that there would be 20 in
> one of the envelopes, the envelope you opened has 15 in it and the other envelope
> can't have 7.5 (because you know there are no coins and there is no such thing as a .5
> bill in the local currency), etc.) then that will change the probabilities, but the puzzle
> says you have no additional information.
> >
> > Your friend is correct in that switching is the better strategy.
> >
> > Another similar puzzle that a lot of people get confused over is:
> >
> > "I have 2 children, one of them is a girl, what is the probability that the other is also a
> girl?"
> >
> > Or even the classic Monty Hall problem (which has many answers depending on the
> motivation of Monty).
> >
> > Hope this helps,
> >
> > (p.s., the above children puzzle is how I heard the puzzle, I actually have 4 children
> (but the 1st 2 are girls, so it was accurate for me for a while).
> >
> > --
> > Gregory (Greg) L. Snow Ph.D.
> > Statistical Data Center
> > Intermountain Healthcare
> > greg.snow at imail.org
> > (801) 408-8111
> >
> >
> >
> >
> >> -----Original Message-----
> >> From: r-help-bounces at r-project.org
> >> [mailto:r-help-bounces at r-project.org] On Behalf Of Mario
> >> Sent: Monday, August 25, 2008 1:41 PM
> >> To: r-help at r-project.org
> >> Subject: [R] Two envelopes problem
> >>
> >> A friend of mine came to me with the two envelopes problem, I
> >> hadn't heard of this problem before and it goes like this:
> >> someone puts an amount `x' in an envelope and an amount `2x'
> >> in another. You choose one envelope randomly, you open it,
> >> and there are inside, say £10. Now, should you keep the £10
> >> or swap envelopes and keep whatever is inside the other
> >> envelope? I told my friend that swapping is irrelevant since
> >> your expected earnings are 1.5x whether you swap or not. He
> >> said that you should swap, since if you have £10 in your
> >> hands, then there's a 50% chance of the other envelope having
> >> £20 and 5% chance of it having £5, so your expected earnings
> >> are £12.5 which is more than £10 justifying the swap. I told
> >> my friend that he was talking non-sense. I then proceeded to
> >> write a simple R script (below) to simulate random money in
> >> the envelopes and it convinced me that the expected earnings
> >> are simply
> >> 1.5 * E(x) where E(x) is the expected value of x, a random
> >> variable whose distribution can be set arbitrarily. I later
> >> found out that this is quite an old and well understood
> >> problem, so I got back to my friend to explain to him why he
> >> was wrong, and then he insisted that in the definition of the
> >> problem he specifically said that you happened to have £10
> >> and no other values, so is still better to swap. I thought
> >> that it would be simply to prove in my simulation that from
> >> those instances in which £10 happened to be the value seen in
> >> the first envelope, then the expected value in the second
> >> envelope would still be £10. I run the simulation and
> >> surprisingly, I'm getting a very slight edge when I swap,
> >> contrary to my intuition. I think something in my code might
> >> be wrong. I have attached it below for whoever wants to play
> >> with it. I'd be grateful for any feedback.
> >>
> >> # Envelopes simulation:
> >> #
> >> # There are two envelopes, one has certain amount of money
> >> `x', and the other an # amount `r*x', where `r' is a positive
> >> constant (usaully r=2 or r=0.5).
> >> You are
> >> # allowed to choose one of the envelopes and open it. After
> >> you know the amount # of money inside the envelope you are
> >> given two options: keep the money from # the current envelope
> >> or switch envelopes and keep the money from the second #
> >> envelope. What's the best strategy? To switch or not to switch?
> >> #
> >> # Naive explanation: imagine r=2, then you should switch
> >> since there is a 50% # chance for the other envelope having
> >> 2x and 50% of it having x/2, then your # expected earnings
> >> are E = 0.5*2x + 0.5x/2 = 1.25x, since 1.25x > x you # should
> >> switch! But, is this explanation right?
> >> #
> >> # August 2008, Mario dos Reis
> >>
> >> # Function to generate the envelopes and their money # r:
> >> constant, so that x is the amount of money in one envelop and
> >> r*x is the
> >> #    amount of money in the second envelope
> >> # rdist: a random distribution for the amount x # n: number
> >> of envelope pairs to generate # ...: additional parameters
> >> for the random distribution # The function returns a 2xn
> >> matrix containing the (randomized) pairs # of envelopes
> >> generateenv <- function (r, rdist, n, ...) {
> >>   env <- matrix(0, ncol=2, nrow=n)
> >>   env[,1] <- rdist(n, ...)  # first envelope has `x'
> >>   env[,2] <- r*env[,1]      # second envelope has `r*x'
> >>
> >>   # randomize de envelopes, so we don't know which one from
> >>   # the pair has `x' or `r*x'
> >>   i <- as.logical(rbinom(n, 1, 0.5))
> >>   renv <- env
> >>   renv[i,1] <- env[i,2]
> >>   renv[i,2] <- env[i,1]
> >>
> >>   return(renv)  # return the randomized envelopes }
> >>
> >> # example, `x' follows an exponential distribution with E(x)
> >> = 10 # we do one million simulations n=1e6) env <-
> >> generateenv(r=2, rexp, n=1e6, rate=1/10)
> >> mean(env[,1]) # you keep the randomly assigned first envelope
> >> mean(env[,2]) # you always switch and keep the second
> >>
> >> # example, `x' follows a gamma distributin, r=0.5 env <-
> >> generateenv(r=.5, rgamma, n=1e6, shape=1, rate=1/20)
> >> mean(env[,1]) # you keep the randomly assigned first envelope
> >> mean(env[,2]) # you always switch and keep the second
> >>
> >> # example, a positive 'normal' distribution # First write
> >> your won function:
> >> rposnorm <- function (n, ...)
> >> {
> >>   return(abs(rnorm(n, ...)))
> >> }
> >> env <- generateenv(r=2, rposnorm, n=1e6, mean=20, sd=10)
> >> mean(env[,1]) # you keep the randomly assigned first envelope
> >> mean(env[,2]) # you always switch and keep the second
> >>
> >> # example, exponential approximated as an integer rintexp <-
> >> function(n, ...) return (ceiling(rexp(n, ...))) # we use
> >> ceiling as we don't want zeroes env <- generateenv(r=2,
> >> rintexp, n=1e6, rate=1/10)
> >> mean(env[,1]) # you keep the randomly assigned first envelope
> >> mean(env[,2]) # you always switch and keep the second i10 <-
> >> which(env[,1]==10)
> >> mean(env[i10,1]) # Exactly 10
> >> mean(env[i10,2]) # ~ 10.58 - 10.69 after several trials
> >>

Dan

Daniel Nordlund
Bothell, WA USA



More information about the R-help mailing list