2016-05-22 8 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に等しい)座席を探し、それを1に割り当てることができるかです。問題の部分はElseステートメントの後にあります。Matlab単列ベクトル、値を置き換えるループ

+0

あなたの現在のループは、ループ本体の乱数を再生成します。その理由はあなたがこの質問をしている理由です(しかし、あなたの質問は不明ですので、私は推測しています)。 'while'ループの前に' randi(100) 'の値を生成して格納し、' seat(this_random_index)== 0'をチェックしてループ内のインデックスを再生成します。このシナリオでは、指定されたシートをwhileループの後の*に設定する必要があります。 Homework^2:MATLAB-yの方法でwhileループを使わずに同じことをします( 'seat'の非ゼロのインデックスを見つけて、それらのインデックスから一つのランダムなものを選んでください)。 –

答えて

0

randiに電話するたびに、別の番号が割り当てられますので、占有している座席を1に再度割り当てることができます。 while trueを使用し、乱数を1回生成し、座席が空いている場合はループの外に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; 休憩。 –

+0

上記の編集を参照 – patstew

0
disp('The probability that your seat will be available is 1/2'); 
: 最初の提案のようなものになるだろう

「おばあちゃん」問題(グラッドは最初の人で、ランダムな座席を選ぶ)と呼ばれています。何かをコードする必要はありません、確率は1/2です)

簡潔なバージョン:おばあちゃんの座席または100人席の座席に座っている最初の人が結果を決定します。そして、おばあちゃんを含むすべての人が、可能な限りすべてのシナリオでおばあちゃんの座席と100人目の座席の座席の確率がまったく同じです。完全な対称性。

+0

[montecarlo]タグは、コーディングを練習することであり、人生の最大の謎を実際に解決することではないことを示唆しています。 –

+0

他のすべてのタグと同じです)この記事に遭遇したグーグルには、コーディングの答えが役立つことはほとんどありません。しかし、私はこのページを見つける人々がどこにいるのかを簡単に想像することができ、本当にこの問題の解決策を模索しています。この質問が削除されない場合、答えはここにある必要があります。 –

+0

stochasticsクラスの生徒がSOをソースとして使用していないことはかなり確信しています;)しかし、私は同意すると、完全に本格的な答えが得られないことに同意します。残念ながら、私たちはもはや "*ローカライズ*"の近い投票理由を持っていません。 –

関連する問題