Alternative to while loops without using loop?

20 ビュー (過去 30 日間)
Manne Plok
Manne Plok 2018 年 9 月 5 日
編集済み: the cyclist 2018 年 9 月 5 日
Hi, are there any more efficient alternatives to while loops. eg
a = zeros(3,1,3);
b = ones(3,1,3);
while isequal(a,b) == 0
a(:,:,1) = [round(rand);round(rand);round(rand)];
a(:,:,2) = [round(rand);round(rand);round(rand)];
a(:,:,3) = [round(rand);round(rand);round(rand)];
b(:,:,1) = [round(rand);round(rand);round(rand)];
b(:,:,2) = [round(rand);round(rand);round(rand)];
b(:,:,3) = [round(rand);round(rand);round(rand)];
end
I

回答 (2 件)

the cyclist
the cyclist 2018 年 9 月 5 日
a = zeros(3,1,3);
b = ones(3,1,3);
while not(isequal(a,b))
a = round(rand(3,1,3));
b = round(rand(3,1,3));
end
  4 件のコメント
Steven Lord
Steven Lord 2018 年 9 月 5 日
Another alternative would be to use randi specifying [0 1] as the first input.

サインインしてコメントする。


the cyclist
the cyclist 2018 年 9 月 5 日
編集済み: the cyclist 2018 年 9 月 5 日
Here is a way to do this without a while loop. It uses the trick I mentioned in a comment, that there are a finite number (512) ways of filling a 3x1x3 array with zeros and ones, and therefore there are 512x511 = 261,632 ways of choosing a pair of distinct entries.
In the code, I ...
  • create the full list
  • pick a at random
  • delete that choice from the list
  • pick b at random
list = dec2bin(0:511) - '0';
a_idx = randi(512);
a = reshape(list(a_idx,:),3,1,3);
list(a_idx,:) = [];
b_idx = randi(511);
b = reshape(list(b_idx,:),3,1,3);
The very first line is itself a pretty slick trick for getting all the permutations.

製品


リリース

R2017b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by