【问题标题】:Matlab Single Row Vector, while loop that replaces valueMatlab单行向量,替换值的while循环
【发布时间】:2016-05-22 22:11:55
【问题描述】:
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 语句之后。

【问题讨论】:

  • 您当前的循环会在循环体中重新生成随机数,这可能就是您问这个问题的原因(但您的问题不清楚,所以我只是在猜测)。在while 循环之前生成并存储randi(100) 值,检查seat(this_random_index)==0,并在循环内重新生成索引。在这种情况下,您必须在 while 循环之后将给定座位设置为 1。作业^2:以 MATLAB-y 方式做同样的事情,不使用 while 循环(找到 seat 的非零索引,从这些索引中随机选择一个)。

标签: matlab for-loop vector probability montecarlo


【解决方案1】:
disp('The probability that your seat will be available is 1/2');

这被称为“奶奶”问题(奶奶是第一个人,随机选择座位)。无需编写任何代码,概率为1/2 :)

证明的简明版本:坐在奶奶座位上的第一个人或第 100 个人座位决定结果。在所有可能的情况下,所有人(包括奶奶)坐在奶奶座位上和第 100 人座位上的概率完全相同。完全对称。

【讨论】:

  • [montecarlo] 标签表明重点是练习编码,而不是真正解决生活中最大的谜团。
  • 与所有其他标签相同)对于任何偶然发现这篇文章的谷歌用户来说,编码答案几乎不可能有用。然而,我可以很容易地想象另一种情况,人们找到这个页面,真正寻找这个问题的解决方案。如果这个问题没有被删除,答案需要在这里。
  • 我相当肯定随机课程的学生不使用 SO 作为来源;)但我同意,这个问题不值得一个完整的答案(这就是为什么我只留下一个评论解决方案)。不幸的是,我们不再有“过于本地化”的接近投票理由了。
【解决方案2】:

您每次拨打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)])

编辑: 第一个建议是这样的:

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

【讨论】:

  • 关于你的第一个建议,如何设置休息座位(a) = randi(100);而座位(a) == 1 座位(a) = 1;休息;
猜你喜欢
  • 2013-04-23
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2016-03-04
  • 2014-08-05
  • 2021-07-27
相关资源
最近更新 更多