2016-05-22 4 views
0
numtrials = 10000; 
empty = 0; 
for i = 1:numtrials 
    seat = zeros(1,100); 
    seat(randi(100)) = 1; 
    for p = 2:99 % second person in line will look for seat 2, only up to 99 because I want to see if 99 is zero 
     if seat(p) == 0 
      seat(p) = 1; 
     else 
      while seat(randi(100)) == 0 
      seat(randi(100)) = 1; 
      end 
     end 
    end 
    if seat(100) == 0 
     empty = empty + 1; 
    end 
end 
disp(empty) 
X = empty/numtrials; 
disp(['The probability that your seat will be available is ', num2str(X)]) 

100 человек стоят в очереди, человек спереди сидит на случайном месте, все остальные сидят в порядке. Если человек находит свое место, они сидят на другом случайном месте. Я пытаюсь найти вероятность того, что место 100 будет открыто к тому времени, когда к нему присоединится последний человек. Мой вопрос заключается в том, как я могу заставить мой цикл while искать открытое (равное 0) место и назначить ему один, указанная часть - после инструкции Else.Matlab Single Row Vector, while loop, который заменяет значение

+0

Ваш текущий цикл восстанавливает случайное число в теле цикла, возможно, поэтому вы задаете этот вопрос (но ваш вопрос неясен, поэтому я только догадываюсь). Создайте и сохраните значение 'randi (100)' перед циклом 'while', проверьте для' seat (this_random_index) == 0' и восстановите индекс внутри цикла. В этом случае вы должны установить заданное место в 1 * после * цикла while. Домашнее задание^2: выполните одно и то же в способе MATLAB-y, без цикла while (найдите ненулевые индексы «места», выберите один случайный из этих индексов). –

ответ

0

Каждый раз, когда вы звоните randi, вы получите другое количество, чтобы вы могли снова назначить занятое место на 1. Вы должны использовать while true, генерировать случайное число один раз, затем break вне цикла, если место не было занято. Вы можете устранить эту петлю полностью отслеживать номера мест, а и только выбирая из пустых мест, как это:

numtrials = 10000; 
empty = 0; 
for i = 1:numtrials 
    seat = 1:100; %List all seat numbers 
    seat = seat(seat~=randi(100)); %Remove a random seat from the list of seats 
    for p = 2:99 % second person in line will look for seat 2, only up to 99 because I want to see if 99 is zero 
     if any(seat == p) 
      seat = seat(seat~=p); 
     else 
      s = seat(randi(length(seat))); %Randomly select an empty seat 
      seat = seat(seat~=s); %Eliminate this seat 
     end 
    end 
    if any(seat == 100) 
     empty = empty + 1; 
    end 
end 
disp(empty) 
X = empty/numtrials; 
disp(['The probability that your seat will be available is ', num2str(X)]) 

EDIT: Первое предложение было бы что-то вроде:

while true 
    s = randi(100); 
    if (seat(s) == 0) 
    seat(s) = 1; 
    break; 
    end 
end 
+0

Что касается вашего первого предложения, как бы установить место разлома (a) = randi (100); в то время как сиденье (a) == 1 сиденье (a) = 1; break; –

+0

См. Редактирование выше – patstew

0
disp('The probability that your seat will be available is 1/2'); 

Это называется проблемой «Бабушка» (Градма - первый человек, выбирающий случайное место). Не нужно ничего кодировать, вероятность равна 1/2:)

Краткая версия доказательства: первое лицо, сидящее либо на сиденье Бабушки, либо на 100-м месте, определяет результат. И все люди (в том числе бабушка) имеют точно такую ​​же вероятность посадки на место бабушки против места 100-го человека во всех возможных сценариях. Полная симметрия.

+0

Тег [montecarlo] предполагает, что дело в том, чтобы практиковать кодирование, а не на самом деле решать величайшие тайны жизни. –

+0

То же, что и все другие теги). Очень мало шансов, что ответ на кодирование окажется полезным для любого гуглера, наткнувшегося на этот пост. Я могу легко представить себе еще одну ситуацию, когда люди находят эту страницу, искренне ищут решение этой проблемы. Если этот вопрос не будет удален, ответ должен быть здесь. –

+0

Я вполне уверен, что ученики классов стохастики не используют SO как источник;) Но я согласен, вопрос не заслуживает полноценного ответа (поэтому я оставил комментарий с решением). К сожалению, мы больше не имеем «слишком локализованных» причин для закрытого голосования. –

 Смежные вопросы

  • Нет связанных вопросов^_^