Proposition: If we are given keys, where only of these keys can open a door, then on average we would have to try keys to open the door.
I previously discussed a similar problem in which I derived that since the probability of finding a correct key on the kth try is
then in theory it would take tries to oppen the door because
I became interested in modeling this proposition so implemented a MATLAB program, try_keys(n,m)
, in which each key is represented by a number from 1 to n and each correct keys is represented by a number from 1 to m. And when the try_keys(n,m)
is executed it outputs a random sequence that starts with any key and ends with a correct key.
Now in theory if had 15 keys, such that 3 keys are correct, then on average I would expect to open the door on the 4th try since
.
For Experiment1 I ran try_keys(15,3)
a total of 10 times
try_keys(15,3) = 13 7 4 6 5 1 try_keys(15,3) = 4 2 try_keys(15,3) = 3 try_keys(15,3) = 4 5 1 try_keys(15,3) = 14 10 5 4 2 try_keys(15,3) = 12 4 3 try_keys(15,3) = 7 1 try_keys(15,3) = 2 try_keys(15,3) = 15 10 6 1 try_keys(15,3) = 4 9 1
and for Experiement2 I repeated the same thing
try_keys(15,3) = 10 8 7 5 6 3 try_keys(15,3) = 12 2 try_keys(15,3) = 11 2 try_keys(15,3) = 6 7 8 1 try_keys(15,3) = 14 8 5 4 6 9 7 10 3 try_keys(15,3) = 5 3 try_keys(15,3) = 13 2 try_keys(15,3) = 4 2 try_keys(15,3) = 4 5 10 2 try_keys(15,3) = 14 10 5 2
So from the first and second experiment, the average number of tries needed to open the door
are within 35% and 7.5% of
Now by the Law of large numbers we would expect that if we ran try_keys(15,3)
an infinite number of times then the average would converge to 4. So, to illustrate this law I implemented average_try_keys(N,n,m)
which runs try_keys(n,m)
, N
times, and computes an average. And, I also implemented plot_average_try_keys(L,n,m)
which plots average_try_keys(i*round(L/30),n,m)
for integer values of i
from 1 to 100. So, here are the plots that I got from plot_average_try_keys(L,15,3)
using L
values 1e2, 1e3, 1e4, 1e5
and 1e6.
And here is the code that I used to generate these plots.
try_keys
function [ s ] = try_keys(n,m) %There are n keys which will be %represented by numbers 1,2,...n. %There are m correct keys which %will be represented by numbers 1,2,...m. %where m is less than or equal to n. if( m > n || n <= 0 || m <= 0) bad_input = 1; quit; end %s is the sequence of keys draw will be s, %where s(1) is the first key %draw, s(2) the second, and so on. %So at most we will try a total of n-m keys. %s = zeros(1,n-m); %We are assuming that that keys are %uniformly distributed, so we will be %using randi(10) but we wont be accepting %keys which we have already %tried. s(1) = randi(n); %We are done when we find a correct key so %we check to see if first key is %correct. If not then we get another key and so on. if( size(find( s <= m ),2) ~= 0) done = 1; else done = 0; end draw = 1; while( done == 0) isnewkey = 0; while(isnewkey ==0) newkey = randi(n); if(size(find(s == newkey),2) == 0) s(draw + 1) = newkey; isnewkey = 1; if( size(find( s <= m ),2) ~= 0) done = 1; else draw = draw + 1; end end end end end
average_try_keys
function mu = average_try_keys(N,n,m) s =zeros(1,N); for i=1:N s(i) = size(try_keys(n,m),2); end mu = mean(s); end
plot_average_try_keys
function plot_average_try_keys(L,n,m) Num_points = 100; expected_value = (n+1)/(m+1); y = zeros(1,Num_points); x = (1:Num_points)*round(L/Num_points); for i=1:Num_points y(i) = average_try_keys(i*round(L/Num_points),n,m); end plot(x,y,'-ro',x,expected_value,'-b') h = legend('averages','expected value',2); set(h,'Interpreter','none')
good job!